Erreur Python «ImportError: aucun module nommé»

452

Python est installé dans un répertoire local.

Mon arborescence de répertoires ressemble à ceci:

(local directory)/site-packages/toolkit/interface.py

Mon code est ici:

(local directory)/site-packages/toolkit/examples/mountain.py

Pour exécuter l'exemple, j'écris python mountain.pyet dans le code j'ai:

from toolkit.interface import interface

Et je reçois l'erreur:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

J'ai déjà vérifié sys.pathet là j'ai le répertoire /site-packages. De plus, j'ai le fichier __init__.py.bindans le dossier toolkit pour indiquer à Python qu'il s'agit d'un package. J'ai également un __init__.py.bindans le répertoire d'exemples.

Je ne sais pas pourquoi Python ne peut pas trouver le fichier lorsqu'il se trouve sys.path. Des idées? Peut-il s'agir d'un problème d'autorisations? Ai-je besoin d'une autorisation d'exécution?

Eduardo
la source
3
Vérifiez que vous avez l'autorisation de lecture sur ce fichier à partir de python. Voir: stackoverflow.com/a/20999950/1657225
cSn
1
Assurez-vous de marquer votre répertoire comme "Root Root" pour informer PyCharm qu'il s'agit d'un package.
emmmphd
Le problème dans mon cas était qu'il n'y avait pas l'autorisation de modules nouvellement installés 755. C'est parce que umaskla machine était en 0027raison de laquelle l' othersn'a pas eu l' readautorisation module de ne pas être cause lu. L'ajout d'une readautorisation a résolu mon problème. Cela vaut la peine de vérifier l'autorisation du répertoire cible après l'installation.
anu
Essayez de faire sauter l'url: stackoverflow.com/questions/47887614/…
Rawan-25
le nom du répertoire local est peut-être interface (a été un conflit).
Benyamin Jafari

Réponses:

267

Sur la base de vos commentaires sur le post d'Orip, je suppose que c'est ce qui s'est passé:

  1. Vous avez édité __init__.pysur Windows.
  2. L'éditeur Windows a ajouté quelque chose de non imprimable, peut-être un retour chariot (la fin de ligne dans Windows est CR / LF; sous Unix c'est LF uniquement), ou peut-être un CTRL-Z (fin de fichier Windows).
  3. Vous avez utilisé WinSCP pour copier le fichier dans votre boîte Unix.
  4. WinSCP a pensé: "Cela a quelque chose qui n'est pas du texte de base; je vais mettre une extension .bin pour indiquer les données binaires."
  5. Le manquant __init__.py(maintenant appelé __init__.py.bin) signifie que python ne comprend pas la boîte à outils en tant que package.
  6. Vous créez __init__.pydans le répertoire approprié et tout fonctionne ...?
John Fouhy
la source
50
De plus, python -c 'importe sys; print sys.path 'aide - parfois l'utilisateur a placé les fichiers dans un chemin non scanné.
mikebabcock
1
J'utilise la même chose, sauf que WinSCP n'a pas été ajouté .bin.
utilisateur
9
si j'ai un "__init__.py" vide, la même chose se produira-t-elle?
dietbacon
2
OMG, vous régnez! Voici mon histoire: 1. Vous avez édité init .py sur Windows 2. Il a ajouté un TAB à la place des espaces 3. Vous googlez beaucoup jusqu'à trouver ce post! ;)
GBrian
1
Pour moi, le problème était que j'utilisais python driver.pyquand j'aurais dû utiliser python3 driver.pydepuis que j'ai installé avec pip3.
Eric Wiener
72

Est-ce que

(local directory)/site-packages/toolkit

avoir un __init__.py?

Pour importer de marche à travers vos répertoires tous les répertoires doit avoir un __init__.pyfichier.

igorgue
la source
1
Bon point! Remarque: depuis Python 3.3, tout répertoire sur sys.path avec un nom qui correspond au nom du package sera reconnu.
PatrickT
1
n'est-ce pas uniquement nécessaire pour les références de chemin d'accès relatives? pourquoi doit chaque répertoire avoir?
Sonic Soul
56

Je suis tombé sur quelque chose de très similaire lorsque j'ai fait cet exercice dans LPTHW; Je n'ai jamais pu faire reconnaître à Python que j'avais des fichiers dans le répertoire à partir duquel j'appelais. Mais j'ai finalement réussi à le faire fonctionner. Ce que j'ai fait et ce que je recommande, c'est d'essayer ceci:

(REMARQUE: d'après votre message initial, je suppose que vous utilisez une machine basée sur * NIX et que vous exécutez des choses à partir de la ligne de commande, donc ce conseil est adapté à cela. Puisque j'exécute Ubuntu, c'est ce que j'ai fait)

1) Modifiez le répertoire (cd) dans le répertoire au - dessus du répertoire où se trouvent vos fichiers. Dans ce cas, vous essayez d'exécuter le mountain.pyfichier et essayez d'appeler le toolkit.interface.pymodule, qui se trouvent dans des répertoires distincts. Dans ce cas, vous iriez dans le répertoire qui contient les chemins d'accès à ces deux fichiers (ou en d'autres termes, le répertoire le plus proche que les chemins d'accès de ces deux fichiers partagent). Qui dans ce cas est le toolkitrépertoire.

2) Lorsque vous êtes dans le tookitrépertoire, entrez cette ligne de code sur votre ligne de commande:

export PYTHONPATH=.

Cela définit votre PYTHONPATH sur ".", Ce qui signifie essentiellement que votre PYTHONPATH recherchera maintenant tous les fichiers appelés dans le répertoire dans lequel vous vous trouvez actuellement (et plus précisément, dans les branches de sous-répertoire du répertoire dans lequel vous vous trouvez. Il ne recherche donc pas seulement dans votre répertoire actuel, mais dans tous les répertoires qui se trouvent dans votre répertoire actuel).

3) Après avoir défini votre PYTHONPATH à l'étape ci-dessus, exécutez votre module à partir de votre répertoire actuel (le toolkitrépertoire). Python devrait maintenant trouver et charger les modules que vous avez spécifiés.

J'espère que cela t'aides. J'étais assez frustré par cela moi-même.

Spectreace
la source
2
Ou sous Windows set PYTHONPATH=..
cjbarth
Cela a fonctionné pour moi. Aussi, j'ai complètement simplifié mes frustrations PYTHONPATH, car je devrais le mettre à jour vers un chemin absolu chaque fois que je change de machine. Merci merci merci.
the_e
41

Sur * nix, assurez-vous également que PYTHONPATH est correctement configuré, en particulier qu'il a ce format:

 .:/usr/local/lib/python

(Faites attention .:au début, afin qu'il puisse également effectuer une recherche dans le répertoire actuel.)

Il peut également se trouver dans d'autres emplacements, selon la version:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
Renaud
la source
6
Il peut également être .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7et etc. , selon la version
Nikita Volkov
Pour moi, le module est dans /usr/local/lib/python3.4/dist-packages mais quand je tape python3 dans le terminal (ubuntu) et que j'essaye de l'importer, il ne me le permet pas, en disant qu'il n'existe pas. "ImportError: aucun module x n'existe"
user65165
L'ajout #!/usr/bin/pythonà la fin d'un fichier devrait également fonctionner, non?
Nearoo
1
@Nearoo, je ne pense pas que cela fonctionnera. De plus, ce shebang est généralement ajouté en haut d'un fichier.
Renaud
2
Sur MacOSX, il a été corrigé en ajoutant PYTHONPATH = / usr / local / lib / python2.7 / site-packages aux scripts de démarrage.
Johan Snowgoose
23

J'ai résolu mon propre problème et j'écrirai un résumé des problèmes et de la solution:

Le fichier doit être appelé exactement __init__.py. Si l'extension est différente, comme dans mon cas, .py.binPython ne peut pas se déplacer dans les répertoires et ne peut pas trouver les modules. Pour modifier les fichiers, vous devez utiliser un éditeur Linux, tel que vi ou nano . Si vous utilisez un éditeur Windows, cela écrira des caractères cachés.

Un autre problème qui l'affectait était que j'avais une autre version Python installée par la racine, donc si quelqu'un travaille avec une installation locale de python, assurez-vous que l'installation Python qui exécute les programmes est le Python local. Pour vérifier cela, faites which python-le et voyez si l'exécutable est celui qui se trouve dans votre répertoire local. Sinon, changez le chemin, mais assurez-vous que le répertoire Python local est antérieur à l'autre Python.

Eduardo
la source
Un problème que j'ai eu, c'est qu'un module a été (ré) installé par pip avec seulement l'utilisateur root pour y accéder, donc l'utilisateur qui a exécuté le programme ne l'a pas vu.
Jānis Elmeris
@ JānisElmeris pouvez-vous en dire plus sur le commentaire ci-dessus, je pense que je suis également confronté à une erreur similaire. J'ai mes __init__.pyfichiers placés dans le répertoire approprié mais j'ai installé manuellement un package à l'aide de setup.py. Comment l'installation d'un nouveau package aurait-elle pu interférer avec les importations?
Krishna Oza
@darth_coder, désolé, c'était il y a six ans et je ne me souviens pas du cas. En outre, je traite très peu de Python, pas du tout récemment. D'après ce que j'ai écrit, je peux simplement penser que j'ai installé un package en tant que root, ce qui a changé les autorisations afin que les autres utilisateurs n'aient pas l'accès qu'ils avaient auparavant.
Jānis Elmeris
19

une solution simple est d'installer le module en utilisant python -m pip install <library-name>au lieu de pip install <library-name> vous pouvez utiliser sudo en cas de restrictions admin

Badr Bellaj
la source
2
Que faut-il python -mréaliser devant pip install?
sporc
1
@sporc - lorsque vous utilisez l'indicateur de ligne de commande -m, Python importera un module ou un package pour vous, puis l'exécutera en tant que script. Lorsque vous n'utilisez pas l'indicateur -m, le fichier que vous avez nommé est exécuté comme un simple script.
Tony Ciccarone
Je ne sais pas ce que cette réponse essaie de dire que cela python -m pip...fonctionne, mais ce pip...n'est pas le cas: ils sont en fait la même chose, en supposant qu'ils sont en fait dans le même pythonrépertoire. Peut-être, la situation observée était que le pipprogramme autonome n'était pas disponible dans une ancienne version de python (mais il est maintenant dans les dernières 2.7 et 3.x). Dans ce cas, le pythonétait dans un virtualenv local et pipne l'était pas, il python -m pip installs'installerait donc dans le virtualenv local, alors pipqu'il essaierait de l'installer dans le système python (et échouerait sans sudo). En tout cas, cela n'a pas de sens.
michael
17

Pour marquer un répertoire en tant que package, vous avez besoin d'un fichier nommé __init__.py, cela vous aide-t-il?

orip
la source
J'ai déjà un fichier appelé init .py.bin, si je change le nom en init .py, alors j'obtiens cette erreur: /__init__.py ", ligne 1" utilitaires "," démo "] ^ SyntaxError: syntaxe invalide
Eduardo
Que contient init .py? Postez-le dans le cadre de votre question, s'il vous plaît.
S.Lott
Il n'y a rien, il est vide, c'est avec le package que je télécharge, dois-je écrire quelque chose dans le fichier?.
Eduardo
@ S.Lott: vous n'avez pas besoin de mettre quoi que ce soit dans votre init .py non?
igorgue
1
@Eduardo. Votre init .py obtient une erreur. Et vous dites que c'est vide. C'est difficile à concilier. Et il ne peut pas être appelé init .py.bin - Python ignorerait ce fichier. En règle générale, il ne peut rien contenir.
S.Lott
16

En utilisant PyCharm(une partie de la suite JetBrains), vous devez définir votre répertoire de script comme source:
Right Click > Mark Directory as > Sources Root

MonoThreaded
la source
12

Vous lisez cette réponse dit que vous __init__.pyêtes au bon endroit, vous avez installé toutes les dépendances et vous obtenez toujours leImportError .

J'étais confronté à un problème similaire, sauf que mon programme fonctionnerait correctement lorsqu'il était exécuté à l'aide de PyCharm, mais l'erreur ci-dessus lorsque je l'exécutais à partir du terminal. Après avoir creusé plus loin, j'ai découvert qu'il PYTHONPATHn'y avait pas d'entrée pour le répertoire du projet. Donc, je définis PYTHONPATHpar instruction d'importation fonctionne sur PyCharm mais pas à partir du terminal :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Il existe une autre façon de le faire en utilisant sys.pathcomme:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Vous pouvez utiliser l'insertion / l'ajout en fonction de l'ordre dans lequel vous souhaitez que votre projet soit recherché.

avp
la source
12

Pour moi, c'était quelque chose de vraiment stupide. J'ai installé la bibliothèque en utilisant pip3 installmais exécutais mon programme python program.pypar opposition à python3 program.py.

kev
la source
1
Hou la la ! Cela a également fonctionné pour moi.
JavaDeveloper
1
Tu m'as sauvé la journée.
Aymen
7

Ouaip. Vous avez besoin du répertoire pour contenir le __init__.pyfichier, qui est le fichier qui initialise le package. Ici, regardez ça .

Les fichiers __init__.py sont nécessaires pour que Python traite les répertoires comme contenant des packages; cela est fait pour empêcher les répertoires avec un nom commun, tel que chaîne, de masquer involontairement des modules valides qui se produisent plus tard sur le chemin de recherche de module. Dans le cas le plus simple, __init__.py peut simplement être un fichier vide, mais il peut également exécuter le code d'initialisation du package ou définir la variable __all__, décrite plus loin.

miya
la source
6
  1. Vous devez avoir le fichier __ init__.py dans le même répertoire où c'est le fichier que vous importez.
  2. Vous ne pouvez pas essayer d'importer un fichier qui porte le même nom et être un fichier de 2 dossiers configurés sur le PYTHONPATH.

par exemple: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

Et, si vous essayez d'importer un fichier foo, python ne saura pas lequel vous voulez.

depuis foo import ... >>> importerror: aucun module nommé foo

Iasmini Gomes
la source
5

Mes deux centimes:

entrez la description de l'image ici

Cracher:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Cela m'a complètement dérangé - j'ai parcouru des messages et des messages suggérant des hacks syspath laids (comme vous le voyez, __init__.pytous étaient là). Il se trouve que game / oblivion.py et game / oblivion confondaient python qui crachait le plutôt inutile "Aucun module nommé RecordGroups". Je serais intéressé par une solution de contournement et / ou des liens documentant ce comportement (du même nom) -> EDIT (2017.01.24) - jetez un œil à Que faire si j'ai un module et un package du même nom? Fait intéressant, normalement les packages ont priorité, mais apparemment notre lanceur viole cela.

EDIT (2015.01.17): Je n'ai pas mentionné que nous utilisons un lanceur personnalisé disséqué ici .

Mr_and_Mrs_D
la source
plus comme le chemin est fermé. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Peut vouloir corriger cela en ajoutant votre code python à utiliser:game.oblivion.patchers.RecordGroups
Dwight Spencer
@DwightSpencer: Je suis sûr d'avoir importé les "RecordGroups" game.oblivion.__init__.pymais je devrai peut-être vérifier cela
Mr_and_Mrs_D
4

Linux: les modules importés se trouvent dans /usr/local/lib/python2.7/dist-packages

Si vous utilisez un module compilé en C, n'oubliez pas de chmoder le fichier .so après sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
KrisWebDev
la source
3

Dans mon cas, le problème était que j'étais lié au débogage python & boost::Python, ce qui nécessite que l'extension soit FooLib_d.pyd, et pas seulement FooLib.pyd; renommer le fichier ou mettre à jour les CMakeLists.txtpropriétés a corrigé l'erreur.

peter karasev
la source
3

Si vous avez essayé toutes les méthodes fournies ci-dessus mais avez échoué, votre module porte peut-être le même nom qu'un module intégré. Ou, un module avec le même nom existant dans un dossier qui a une priorité élevée dans sys.pathcelle de votre module.

Pour déboguer, dites vos from foo.bar import bazplaintes ImportError: No module named bar. Changer pour import foo; print foo, qui montrera le chemin de foo. C'est ce que vous attendez?

Sinon, renommez fooou utilisez les importations absolues .

liushuaikobe
la source
1
Pour moi, cela cède ImportError: No module named foo.
alex
3

Mon problème était que j'avais ajouté le répertoire avec le __init__.pyfichier à PYTHONPATH, alors qu'en fait j'avais besoin d'ajouter son répertoire parent.

Riches
la source
3

À tous ceux qui ont encore ce problème. Je crois que Pycharm se confond avec les importations. Pour moi, lorsque j'écris «à partir de l'espace de noms, importez quelque chose», la ligne précédente est soulignée en rouge, signalant qu'il y a une erreur, mais fonctionne. Cependant, «à partir de .namespace importer quelque chose» n'est pas souligné, mais ne fonctionne pas non plus.

Essayer

try:
    from namespace import something 
except NameError:
    from .namespace import something
AKJ
la source
1
Le premier est la syntaxe python 2, le second est le python 3.
Tanya Branagan
2

Correction de mon problème en écrivant print (sys.path)et découvert que python utilisait des packages obsolètes malgré une installation propre. La suppression de ces pythons créés utilise automatiquement les packages appropriés.

citron
la source
2

Dans mon cas, parce que j'utilise PyCharm et PyCharm, créez un 'venv' pour chaque projet dans le dossier du projet, mais ce n'est qu'un mini env de python. Bien que vous ayez installé les bibliothèques dont vous avez besoin en Python, mais dans votre projet personnalisé 'venv', il n'est pas disponible. C'est la vraie raison de 'ImportError: Aucun module nommé xxxxxx' ne s'est produit dans PyCharm. Pour résoudre ce problème, vous devez ajouter des bibliothèques à votre projet personnalisé env par ces étapes:

  • Dans PyCharm, depuis le menu 'Fichier' -> Paramètres
  • Dans la boîte de dialogue Paramètres, Project: XXXProject-> Project Interpreter
  • Cliquez sur le bouton "Ajouter", il vous montrera la boîte de dialogue "Packages disponibles"
  • Recherchez votre bibliothèque, cliquez sur «Installer le package»
  • Ensuite, tout le package dont vous avez besoin sera installé dans votre dossier personnalisé 'venv'.

Boîte de dialogue des paramètres

Prendre plaisir.

Yuanhui
la source
0

Après avoir juste souffert du même problème, j'ai trouvé que ma résolution était de supprimer tout pyc fichiers de mon projet, il semble que ces fichiers mis en cache provoquaient en quelque sorte cette erreur.

Le moyen le plus simple que j'ai trouvé pour ce faire était de naviguer vers mon dossier de projet dans l'explorateur Windows et de rechercher *.pyc, puis de sélectionner tout ( Ctrl+ A) et de les supprimer ( Ctrl+X ).

Il est possible que j'aurais pu résoudre mes problèmes en supprimant simplement le pycfichier spécifique , mais je n'ai jamais essayé cela

Sayse
la source
0

Je fait face au même problème: Import error. De plus, la bibliothèque a été installée à 100% correctement. La source du problème était que sur ma version PC 3 de python (paquet anaconda) ont été installés). C'est pourquoi la bibliothèque n'a pas été installée au bon endroit. Après cela, je viens de passer à la bonne version de python dans mon IDE PyCharm.

Rocketq
la source
0

J'ai eu la même erreur. Cela a été causé par la création d'un dossier dans le même dossier que mon script, dont le nom était en conflit avec un module que j'importais d'ailleurs. Au lieu d'importer le module externe, il a regardé dans ce dossier qui ne contenait évidemment pas les modules attendus.

Toivo Säwén
la source
0

J'ai eu le même problème (Python 2.7 Linux), j'ai trouvé la solution et je voudrais la partager. Dans mon cas, j'avais la structure ci-dessous:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

Dans 'main.py', j'avais essayé sans succès toutes les combinaisons ci-dessous:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

La solution était beaucoup plus simple que je ne le pensais. J'ai renommé le dossier "Booklet" en "booklet" et c'est tout. Python peut maintenant importer la classe Question normalement en utilisant dans 'main.py' le code:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

De là, je peux conclure que les noms de paquets (dossiers) comme 'booklet' doivent commencer à partir de minuscules, sinon Python le confond avec les noms de classe et les noms de fichiers.

Apparemment, ce n'était pas votre problème, mais la réponse de John Fouhy est très bonne et ce fil contient presque tout ce qui peut provoquer ce problème. Donc, c'est encore une chose et j'espère que cela pourrait peut-être aider les autres.

ioaniatr
la source
0

Dans mon cas, j'incluais le chemin vers le dossier package.egg plutôt que le package réel en dessous. J'ai copié le package au niveau supérieur et cela a fonctionné.

Fakrudeen
la source
0

Cela a fonctionné pour moi: __init__.pyfichier créé dans le dossier parent (dans votre cas, dans le site-packagesdossier). Et importé comme ça:

from site-packages.toolkit.interface import interface

J'espère que cela vous sera également utile!

Sherzod
la source
0

Dans le serveur Linux, essayez dos2unix script_name

(supprimer tous les pycfichiers (s'il y en a) avec la commande find . -name '*.pyc' -delete)

et réexécuter dans le cas si vous avez travaillé sur un script sur Windows

Poli
la source
0

Dans mon cas, j'utilisais sys.path.insert()pour importer un module local et j'obtenais à module not foundpartir d'une bibliothèque différente. Je devais mettre en sys.path.insert()dessous les importations qui faisaient état module not found. Je suppose que la meilleure pratique consiste à mettre sys.path.insert()au bas de vos importations.

Michał Zawadzki
la source