J'ai une application python avec la structure de répertoire suivante:
src
|
+---- main
|
+---- util
|
+---- gen_py
|
+---- lib
Dans le package principal, j'ai un python nommé MyServer.py qui contient une instruction d'importation telle que:
from gen_py.lib import MyService
Pour que cette déclaration fonctionne, j'ai placé la ligne suivante au début de MyServer.py:
import sys
sys.path.append('../gen_py/lib')
Lorsque j'exécute MyServer.py dans le terminal, le message d'erreur suivant s'affiche:
ImportError: Aucun module nommé gen_py.lib
Qu'est-ce qui me manque ici?
Votre modification de sys.path
suppose que le répertoire de travail actuel est toujours dans main/
. Ce n'est pas le cas. Au lieu de cela, ajoutez simplement le répertoire parent à sys.path
:
import sys
import os.path
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import gen_py.lib
N'oubliez pas d'inclure un fichier __init__.py
dans gen_py et lib - sinon, ils ne seront pas reconnus en tant que Python modules.
Pour que l’importation du module Python fonctionne, vous devez avoir "src" dans votre chemin, pas "gen_py/lib".
Lors du traitement d'une importation telle que import gen_py.lib
, Il cherche un module gen_py
, Puis un sous-module lib
.
Comme le module gen_py
Ne sera pas dans "../gen_py/lib" (ce sera dans ".."), le chemin que vous avez ajouté ne fera rien pour faciliter le processus d'importation.
Selon l'endroit où vous l'exécutez, essayez d'ajouter le chemin relatif au dossier "src". Peut-être que c'est sys.path.append('..')
. Vous pouvez également avoir réussi à exécuter le script directement dans le dossier src, via des chemins relatifs tels que python main/MyServer.py
from ..gen_py.lib import MyService
ou
from main.gen_py.lib import MyService
Assurez-vous d'avoir un (au moins vide) __init__.py
fichier sur chaque répertoire.
C'est si vous construisez un paquet et que vous trouvez une erreur dans les importations. La réponse n’est pas d’ajouter le paquet à python ou de le faire par programme (que se passe-t-il si votre module est installé et que votre commande l’ajoute à nouveau?) mauvaise façon.
La bonne chose à faire est de: 1) utiliser virtualenv pyvenv-3.4 ou quelque chose de similaire. 2) activer le mode de développement - $ python setup.py develop
assurez-vous d'inclure __init__.py
, ce qui fait Python savoir que ces répertoires contiennent des paquets
Assurez-vous que le répertoire du projet racine apparaît dans la sortie sys.path. Sinon, veuillez ajouter le chemin du répertoire du projet racine à sys.path.