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?
D'après vos commentaires sur le message d'orip, je suppose que c'est ce qui s'est passé:
__init__.py
sur Windows.__init__.py
manquant (maintenant appelé __init__.py.bin
) signifie que python ne comprend pas le toolkit comme un paquet.__init__.py
dans le répertoire approprié et tout fonctionne ...?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
.
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.
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.
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.
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.
Pour marquer un répertoire en tant que package, vous avez besoin d'un fichier nommé __init__.py
, est-ce que cela vous aide?
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
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
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.
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
Mes deux centimes:
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 .
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.
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.
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 .
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.
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.
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!
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.
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
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.
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:
Prendre plaisir.
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.
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é.
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 ¯\_(ツ)_/¯
.
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