chargement du module Intrapackage en python
-
25-10-2019 - |
Question
Je commence avec python et ont des problèmes à comprendre le chemin recherche de chargement du module intra-paquet. J'ai une structure comme ceci:
top/ Top-level package
__init__.py Initialize the top package
src/ Subpackage for source files
__init__.py
pkg1/ Source subpackage 1
__init__.py
mod1_1.py
mod1_2.py
...
pkg2/ Source subpackage 2
__init__.py
mod2_1.py
mod2_2.py
...
...
test/ Subpackage for unit testing
__init__.py
pkg1Test/ Tests for subpackage1
__init__.py
testSuite1_1.py
testSuite1_2.py
...
pkg2Test/ Tests for subpackage2
__init__.py
testSuite2_1.py
testSuite2_2.py
...
...
Dans testSuite1_1 je besoin de module d'importation mod1_1.py (et ainsi de suite). Qu'est-ce que la déclaration d'importation dois-je utiliser? tutoriel officiel de Python (à docs.python.org, sec 6.4.2) dit:
« Si le module importé ne se trouve pas dans le paquetage courant (le paquet dont le module en cours est un sous-module), l'apparence de déclaration d'importation pour un module de niveau supérieur avec le nom donné. »
Je pris cela signifie que je pourrais utiliser (à partir de testSuite1_1.py):
d'importation src.pkg1 mod1_1
ou
src.pkg1.mod1_1 import
ni travaux. J'ai lu plusieurs réponses à des questions similaires ici, mais n'a pas pu trouver une solution.
Edit: Je change le nom du module pour suivre les conventions de nommage de Python. Mais je ne peux toujours pas cet exemple simple au travail.
La solution 2
Problème résolu avec l'aide de http://legacy.python.org/doc /essays/packages.html (appelé dans une question similaire). Le point clé de contact (perhpas évident pour les développeurs de Python plus expérimentés) est la suivante:
"Pour un programme Python d'utiliser un paquet, le paquet doit être trouvable par la déclaration d'importation. Autrement dit, le paquet doit être un sous-répertoire d'un répertoire qui est sys.path. [...] la meilleure façon de veiller à ce qu'un paquet était sur sys.path était soit l'installer dans la bibliothèque standard ou d'avoir aux utilisateurs d'étendre sys.path en réglant leur variable d'environnement shell $ PYTHONPATH "
Ajout du chemin vers « top » à PYTHONPATH a résolu le problem.To faire la solution portable (ce qui est un projet personnel, mais je dois le partager sur plusieurs machines), je suppose avoir un code d'initialisation minimale en haut / configuration .py devrait fonctionner.
Autres conseils
Le nom du module ne comprend pas l'extension de .py
. En outre, dans votre exemple, le module de niveau supérieur est en fait le nom top
. Et enfin, les traits d'union ne sont pas légales pour les noms en python, je vous suggère de les remplacer par des underscores. Ensuite, essayez:
from top.src.pkg1 import mod1_1