web-dev-qa-db-fra.com

Erreur Python "ImportError: aucun module nommé"

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.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à vérifié sys.path et j'ai le répertoire /site-packages. De plus, j'ai le fichier __init__.py.bin dans le dossier toolkit pour indiquer à Python qu'il s'agit d'un paquet. J'ai aussi un __init__.py.bin dans le répertoire des exemples.

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 d'autorisations? Ai-je besoin d'une autorisation d'exécution?

351
Eduardo

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

  1. Vous avez édité __init__.py sur Windows.
  2. L'éditeur Windows a ajouté quelque chose de non-imprimable, peut-être un retour-chariot (fin de ligne dans Windows est CR/LF; sous unix, il s'agit de LF uniquement), ou peut-être un CTRL-Z -fichier).
  3. Vous avez utilisé WinSCP pour copier le fichier dans votre zone Unix.
  4. WinSCP pensa: "Cela a quelque chose qui n'est pas un texte de base; je vais mettre une extension .bin pour indiquer des données binaires."
  5. Le __init__.py manquant (maintenant appelé __init__.py.bin) signifie que python ne comprend pas le toolkit comme un paquet.
  6. Vous créez __init__.py dans le répertoire approprié et tout fonctionne ...?
223
John Fouhy

Est-ce que

(local directory)/site-packages/toolkit

avoir un __init__.py?

Pour importer marcher dans vos répertoires, chaque répertoire doit avoir un fichier __init__.py.

58
igorgue

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

 .:/usr/local/lib/python

(Faites attention au .: au début pour qu’il puisse également effectuer une recherche dans le répertoire en cours.)

Il peut également être ailleurs, en fonction de la version:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
37
Renaud

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

(REMARQUE: depuis votre post initial, je suppose que vous utilisez une machine basée sur * NIX et que vous exécutez des tâches à partir de la ligne de commande. Ce conseil est donc adapté à cela. Depuis que je lance Ubuntu, voici ce que j'ai fait.) 

1) Remplacez le répertoire (cd) par le répertoire ci-dessus 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, situés dans des répertoires distincts. Dans ce cas, vous iriez au répertoire contenant les chemins d'accès à ces deux fichiers (ou, en d'autres termes, au répertoire le plus proche partagé par les chemins d'accès de ces deux fichiers). Qui dans ce cas est le répertoire toolkit.

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

export PYTHONPATH=.

Cela définit votre PYTHONPATH sur ".", Ce qui signifie que votre PYTHONPATH va maintenant rechercher tous les fichiers appelés dans le répertoire dans lequel vous vous trouvez (et plus précisément dans le branches du sous-répertoirele répertoire dans lequel vous vous trouvez. Ainsi, il ne regarde pas uniquement dans votre répertoire actuel, mais dans tous les répertoires qui sont 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 répertoire toolkit). 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. 

30
Specterace

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

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

Un autre problème qui affectait le système était que la racine avait installé une autre version de Python. Par conséquent, 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 simplement which python et voyez si l'exécutable est celui qui se trouve dans votre répertoire local. Sinon, modifiez le chemin, mais assurez-vous que le répertoire Python local est plus ancien que les autres Python.

22
Eduardo

une solution simple consiste à 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 administratives.

15
Badr Bellaj

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

14
orip

En utilisant PyCharm (composant de la suite JetBrains), vous devez définir votre répertoire de script en tant que Source:
Right Click > Mark Directory as > Sources Root

11
MonoThreaded
  1. Le fichier __ init__.py doit être dans le même répertoire que le fichier que vous importez.
  2. Vous ne pouvez pas essayer d'importer un fichier portant le même nom et constituant un fichier de 2 dossiers configurés sur 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.

from foo import ... >>> importerror: pas de module nommé foo

6
Iasmini Gomes

Ouaip. Le répertoire doit contenir le fichier __init__.py, qui est le fichier qui initialise le package. Ici, jetez un oeil à this .

Les fichiers __init__.py sont nécessaires pour que Python traite les répertoires comme contenant des packages; Ceci est fait pour empêcher les répertoires avec un nom commun, tel que string, de cacher par inadvertance des modules valides apparaissant 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
miya

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
4
KrisWebDev

Mes deux centimes:

enter image description here

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 a dérouté mon enfer - parcouru les messages et les messages suggérant de sombres hacks syspath (comme vous voyez mon __init__.py étaient tous là). Eh bien, il s'avère que ce jeu/oubli.py et ce jeu/oubli étaient déroutants en python Ce qui a craché le peu inutile "Aucun module nommé RecordGroups". Je souhaiterais une solution de contournement et/ou des liens documentant ce comportement (même nom) -> EDIT (2017.01.24) - jetez un coup d'œil à Et si j'ai un module et un package du même nom? Intéressant normalement packages ont priorité, mais apparemment notre lanceur le viole.

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

3
Mr_and_Mrs_D

Dans mon cas, le problème était que je me connectais à debug python & boost::Python, qui nécessite 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
peter karasev

Mon problème était que j'ai ajouté le répertoire avec le fichier __init__.py à PYTHONPATH, alors qu'en réalité je devais ajouter son répertoire parent. 

3
Rich

Si vous avez essayé toutes les méthodes décrites ci-dessus mais que vous avez échoué, votre module a peut-être le même nom qu'un module intégré. Ou bien, un module avec le même nom existant dans un dossier hautement prioritaire dans sys.path que celui de votre module.

Pour déboguer, dites votre from foo.bar import baz plaintes ImportError: No module named bar. Passer à import foo; print foo, ce qui affichera le chemin de foo. Est-ce ce que vous attendez?

Si ce n'est pas le cas, renommez foo ou utilisez absolute imports .

2
liushuaikobe

J'ai corrigé mon problème en écrivant print (sys.path) et j'ai découvert que Python utilisait des paquetages obsolètes malgré une nouvelle installation. La suppression de ces python fabriqués utilise automatiquement les bons packages.

1
dukevin

J'ai eu la même erreur. Cela était dû au fait que quelqu'un avait créé un dossier dans le même dossier que mon script, dont le nom était en conflit avec un module que j'importais 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
Toivo Säwén

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

from site-packages.toolkit.interface import interface

J'espère que cela vous sera utile aussi!

0
Sherzod

J'ai eu le même problème (Python 2.7 Linux), j'ai trouvé la solution et j'aimerais le 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 "Livret" en "Livret" et c'est tout. Maintenant, Python peut 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

Je peux donc en conclure que les noms de paquets (dossiers) tels que 'booklet' doivent commencer par des minuscules, sinon Python le confond avec les noms de classe et les noms de fichiers.

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

0
ioaniatr

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

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

Il est possible que j'aurais pu résoudre mes problèmes en supprimant simplement le fichier pyc mais je n'ai jamais essayé cette

0
Sayse

J'ai rencontré le 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 mon PC 3 versions de python (paquet anaconda) ont été installées). C'est pourquoi la bibliothèque a été installée non au bon endroit. Après cela, je viens de passer à la version appropriée de python dans mon IDE PyCharm.

0
Rocketq

Dans mon cas, parce que j'utilise PyCharm, PyCharm crée un "venv" pour chaque projet du dossier de 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 env personnalisé du projet en procédant comme suit:

  • Dans PyCharm, à partir du menu 'Fichier' -> Paramètres
  • Dans la boîte de dialogue Paramètres, Projet: XXXProject-> Interprète de projet
  • Cliquez sur le bouton "Ajouter" pour afficher la boîte de dialogue "Packages disponibles".
  • Recherchez dans votre bibliothèque, cliquez sur 'Installer le package'
  • Ensuite, tout le paquet dont vous aurez besoin sera installé dans le dossier "venv" personnalisé de votre projet.

 Settings dialog

Prendre plaisir.

0
Yuanhui

Vous lisez cette réponse, dit que votre __init__.py est au bon endroit, que vous avez installé toutes les dépendances et que vous obtenez toujours la ImportError.

J'étais confronté à un problème similaire, à l'exception du fait que mon programme fonctionnait correctement lorsque je l'exécutais à l'aide de PyCharm, mais que l'erreur ci-dessus était rencontrée lorsque je l'exécutais depuis le terminal. Après avoir approfondi mes recherches, j'ai découvert que PYTHONPATH n'avait pas l'entrée pour le répertoire du projet. Donc, je règle ceci en utilisant 

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

Il existe un autre moyen de faire cela en utilisant sys.path en tant que:

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

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

HTH.

La source

0
avp

Dans mon cas, j'incluais le chemin d'accès au dossier package.Egg plutôt que le paquet en dessous. J'ai copié le paquet au plus haut niveau et cela a fonctionné.

0
Fakrudeen

Pour moi, c'était quelque chose de vraiment stupide. J'ai installé la bibliothèque à l'aide de pip3 install mais mon programme était exécuté sous le nom python program.py et non pas python3 program.py. C'est comme ça parfois ¯\_(ツ)_/¯.

0
kev

A tous ceux qui ont encore ce problème. Je crois que Pycharm se confond avec les importations. Pour moi, quand j'écris 'depuis quelque chose d'importer' depuis un espace de noms, la ligne précédente est soulignée en rouge, indiquant qu'il y a une erreur, mais qu'elle fonctionne. Cependant '' depuis .namespace import quelque chose 'ne sera pas souligné, mais ne fonctionnera pas non plus.

Essayer

try:
    from namespace import something 
except NameError:
    from .namespace import something
0
AKJ