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?


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 ...?

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.


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.


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.

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.


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


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?


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


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é.


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.


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.


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


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 .


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

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.


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 .


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.


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

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.


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.


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


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.


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.


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.


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é.


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!


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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.