Erreur Python " ImportError: aucun module nommé"

Python est installé dans un répertoire local.

L'arborescence de mon répertoire 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.py , et 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à coché sys.path et là, j'ai le répertoire /site-packages . Aussi, Je avoir le fichier __init__.py.bin dans le dossier de la boîte à outils pour indiquer à Python qu'il s'agit d'un paquet. J'ai aussi un __init__.py.bin dans le répertoire examples.

Je ne sais pas pourquoi Python ne peut pas trouver le fichier quand il est dans sys.path . Des idées? Peut-il s'agir d'un problème de permissions? Faire j'ai besoin d'une permission d'exécution?

320
demandé sur alex 2008-12-04 00:26:28

21 réponses

D'après vos commentaires sur le post d'orip, je suppose que c'est ce qui s'est passé:

  1. vous avez modifié __init__.py sous windows.
  2. l'éditeur de windows a ajouté quelque chose de non-impression, peut-être un carriage-return (fin de ligne dans Windows Est CR/LF; dans unix il est LF seulement), ou peut-être un CTRL-Z (fin de ligne de windows).
  3. vous avez utilisé WinSCP pour copier le fichier dans votre boîte unix.
  4. WinSCP pensée: "cela a quelque chose qui n'est pas un texte de base, je vais le mettre .bin extension pour indiquer les données binaires."
  5. "the missing __init__.py (maintenant appelé __init__.py.bin ) signifie que python ne comprend pas toolkit en tant que paquet.
  6. Vous créez __init__.py dans le répertoire approprié et tout fonctionne... ?
214
répondu John Fouhy 2008-12-04 00:17:40

Ne

(local directory)/site-packages/toolkit

avez-vous un __init__.py ?

to make import walk dans vos répertoires, chaque répertoire doit avoir un fichier __init__.py .

57
répondu igorgue 2008-12-03 21:50:15

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

 .:/usr/local/lib/python

(l'Esprit de la .: au début, de sorte qu'il peut rechercher le répertoire courant, trop.)

il peut aussi être dans d'autres endroits, selon la version:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
35
répondu Renaud 2017-01-19 19:10:24

j'ai rencontré quelque chose de très similaire lorsque j'ai fait cet exercice dans LPTHW; Je n'ai jamais pu faire reconnaître par Python que j'avais des fichiers dans le répertoire d'où j'appelais. Mais j'ai réussi à le faire marcher à la fin. Ce que j'ai fait, et ce que je recommande, c'est d'essayer ceci:

(NOTE: de votre poste 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. Depuis que je dirige Ubuntu, c'est ce que je did)

1) Changez le répertoire (cd) pour le répertoire au-dessus de le répertoire où se trouvent vos fichiers. Dans ce cas, vous essayez d'exécuter le fichier mountain.py , et d'appeler le module toolkit.interface.py , qui sont dans des répertoires séparés. Dans ce cas, vous allez dans le répertoire qui contient les chemins vers ces deux fichiers (ou en d'autres termes, le répertoire le plus proche que les chemins de ces deux fichiers partagent). Qui dans ce cas est le toolkit répertoire.

2) lorsque vous êtes dans le répertoire tookit , Inscrivez cette ligne de code sur votre ligne de commande:

export PYTHONPATH=.

cela place votre PYTHONPATH à".", ce qui signifie essentiellement que votre PYTHONPATH va maintenant chercher tous les fichiers appelés dans le répertoire dans lequel vous êtes actuellement, (et plus précisément, dans le sous-répertoire branches du répertoire dans lequel vous êtes. Afin de ne pas regarder dans votre répertoire courant, mais dans tous les répertoires qui sont dans votre répertoire courant).

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

Espérons que cette aide. J'ai été très frustré avec moi-même.

27
répondu Specterace 2014-04-22 03:52:48

j'ai résolu mon propre problème, et je vais écrire un résumé des choses qui étaient mauvaises et la solution:

Le fichier doit être appelé exactement __init__.py . Si L'extension est différente comme dans mon cas .py.bin alors Python ne peut pas se déplacer à travers les répertoires et alors il ne peut pas trouver les modules. Pour éditer les fichiers, vous devez utiliser un éditeur Linux, tel que vi ou nano . Si vous utilisez un éditeur de Windows écrira quelques caractères cachés.

un autre problème qui l'affectait était que j'avais une autre version de Python installée par la racine, donc si quelqu'un travaille avec une installation locale de python, soyez sûr que l'installation de Python qui exécute les programmes est le Python local. Pour vérifier cela, il suffit de faire which python , et de voir si l'exécutable est celui qui est dans votre répertoire local. Si non, changez le chemin, mais assurez-vous que le répertoire local de Python est avant que les autres Python.

22
répondu Eduardo 2017-01-19 19:09:33

Pour marquer un répertoire comme un paquet, vous avez besoin d'un fichier nommé __init__.py , cela vous aide?

13
répondu orip 2008-12-03 21:31:53

une solution facile 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 d'administration

9
répondu Badr Bellaj 2017-09-18 15:30:28

en utilisant PyCharm (faisant partie de la suite JetBrains) vous devez définir votre répertoire de script comme Source:

Right Click > Mark Directory as > Sources Root

7
répondu MonoThreaded 2017-01-04 17:53:35
  1. Vous devez avoir le fichier __ init__.py dans le même répertoire où le fichier que vous importez.
  2. vous ne pouvez pas essayer d'importer un fichier qui a le même nom et être un fichier à partir de 2 dossiers configurés sur PYTHONPATH.

par exemple: /etc/environnement

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

/opt/dossier1/foo

/opt/dossier2/foo

Et, si vous essayez d'importer fichier foo, python ne saurez pas qui vous voulez.

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

6
répondu Iasmini Gomes 2014-01-09 19:45:22

Yup. Vous avez besoin du répertoire pour contenir le fichier __init__.py , qui est le fichier qui initialise le paquet. Ici, jetez un oeil à ce .

le _ _ init__.py les fichiers sont nécessaires pour que Python considère les répertoires comme contenant des paquets; ceci est fait pour empêcher les répertoires avec un nom commun, comme string, de cacher involontairement des modules valides qui se produisent plus tard sur le chemin de recherche du module. Dans le cas le plus simple, _Je ne sais pas. init__.py peut être juste un fichier vide, mais il peut aussi exécuter le code d'initialisation pour le paquet ou définir la variable __all_, décrite plus tard.

5
répondu miya 2013-06-28 12:01:27

Linux: les modules importés sont situés dans /usr/local/lib/python2.7 / colis dist

si vous utilisez un module compilé en C, n'oubliez pas de chmod le .donc file après sudo setup.py install .

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
4
répondu KrisWebDev 2014-05-30 22:50:26

dans mon cas, le problème était que je Liais au débogage python & boost::Python , ce qui exige que l'extension soit FooLib_d.pyd , pas seulement FooLib.pyd ; renommer le fichier ou mettre à jour les propriétés CMakeLists.txt a corrigé l'erreur.

3
répondu peter karasev 2017-01-19 19:17:51

mes deux cents:

enter image description here

Spit:

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 embrouillé - j'ai traversé des poteaux et des poteaux suggérant de vilains hacks de syspath (comme vous voyez mes __init__.py étaient tous là). Il s'avère que game/oblivion.py et game / oblivion était déroutant python qui recrache le "No module named RecordGroups"plutôt inutile. Je serais intéressé par une solution de contournement et/ou des liens documenter ce comportement (même nom) - > EDIT (2017.01.24) - regarder et si j'avais un Module et un paquet avec le même nom? fait intéressant normalement paquets ont priorité mais apparemment notre lanceur viole ceci.

MODIFIER (2015.01.17): je n'ai pas mentionné, nous utilisons un custom launcher disséqué ici .

2
répondu Mr_and_Mrs_D 2017-05-23 12:18:23

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

2
répondu Rich 2018-03-28 09:13:13

si vous avez essayé toutes les méthodes fournies ci-dessus mais que vous avez échoué, peut-être que votre module a le même nom comme module intégré. Ou, un module avec le même nom existant dans un dossier qui a une haute priorité dans sys.path que votre module.

pour déboguer, dites votre from foo.bar import baz plaintes ImportError: No module named bar . Changer en import foo; print foo , qui montrera le chemin de foo . Est-ce que vous attendez?

dans la négative, soit renommer foo , soit utiliser importations absolues .

1
répondu liushuaikobe 2017-05-02 06:41:36

après avoir juste subi le même problème que j'ai trouvé ma résolution était de supprimer tous les fichiers pyc de mon projet, il semble que ces fichiers mis en cache étaient en quelque sorte à l'origine de cette erreur.

la façon la plus facile que j'ai trouvé pour faire cela était de naviguer dans mon dossier de projet dans Windows explorer et la recherche de *.pyc , puis en sélectionnant tous ( Ctrl + A ) et en les supprimant ( Ctrl + X ).

C'est possible j'aurais pu résoudre mes problèmes en supprimant simplement le fichier spécifique pyc mais je n'ai jamais essayé cela

0
répondu Sayse 2014-08-08 08:59:39

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

0
répondu Rocketq 2015-12-05 07:21:41

a corrigé mon problème en écrivant print (sys.path) et a découvert que python utilisait des paquets périmés malgré une installation propre. La suppression de ces paquets a fait que python utilise automatiquement les paquets corrects.

0
répondu dukevin 2016-07-21 18:51:03

j'ai eu la même erreur. Il a été causé par quelqu'un créant un dossier dans le même dossier que mon script, dont le nom entrait en conflit avec un module que j'importais d'ailleurs. Au lieu d'importer le module externe, il a regardé à l'intérieur de ce dossier qui ne contenait évidemment pas les modules attendus.

0
répondu Toivo Säwén 2016-12-13 13:02:16

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

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

in " main.py "j'ai 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 "Livret" dans le "livret" et c'est tout. Maintenant Python peut importer la question de classe normalement en utilisant in 'main.py" le code:

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

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

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

0
répondu ioaniatr 2018-05-27 23:49:12

dans mon cas, j'incluais le chemin vers le paquet.oeuf dossier plutôt que sur le paquet en dessous. J'ai copié le paquet au plus haut niveau et ça a marché.

0
répondu Fakrudeen 2018-06-29 22:57:55