2017-09-05 5 views
3

J'ai donc vu pas mal de réponses à propos du fichier __init__.py et, pour être honnête, tout est très confus pour moi et je ne comprends pas vraiment , donc j'espère de l'aide/explication de base.Corriger la structure pour la hiérarchie __init__.py dans les paquets Python

J'ai un paquet mis en place comme suit:

top_package/ 
├── __init__.py 
└── mid_package/ 
    ├── __init__.py 
    ├── first_import.py 
    └── bottom_package/ 
     ├── __init__.py 
     └── second_import.py 

J'ai donc quelques questions ici ...

Comment importer first_import.py en second_import.py? Puis, comment importer second_import.py dans first_import.py?

Enfin, si j'ai un script en dehors de toute cette hiérarchie, dire comme ceci:

docs/ 
├── scripts 
| └── test_script.py 
└── top_package/ 

Comment pourrais-je importer first_import.py et second_import.py dans test_script.py?

Ma version Python est 3.4.5 (64 bits Anaconda) et je cours sous Windows, si cela fait une différence.

Donc, avec ces questions sur la façon, je vais vous donner un peu de contexte sur ce que j'ai essayé jusqu'à présent:

(1) J'initialisés chaque __init.py avec son « niveau », comme celui-ci dans le "top" __init__.py:

import sys 
sys.path.append("C:\Path\To\top_package") 

(2) I ajouté une ligne avec __all__ et un tableau de tout sur ce niveau, par exemple:

__all__ = ['mid_package'] 

(3) Ensuite, j'ajouté les importations relatives telles que:

from .mid_package import first_import 

Ou:

from .. import first_import 

(4) Ensuite, je voudrais essayer de les charger normalement dans des fichiers comme celui-ci dans second_import.py:

import first_import 

(5) Ensuite, test_script.py, je tente de charger comme:

import sys 
sys.path.append('../top_package/') 
import first_import 

Ce qui donnerait ImportError: No module named 'first_import'.

Je suis partant pour toutes les idées, je travaille sur ce sujet depuis quelques heures maintenant et je n'arrive pas à le trouver. Merci beaucoup!

+0

utiliser l'importation absolue. 'from top_package.mid_package importer first_import' et' from top_package.mid_package.bottom_package importer second_import' – Sraw

+0

@Sraw Dans les fichiers '__init __ .py' ou dans des fichiers externes? – user3684314

+0

@Sraw faisant cela avec les fichiers externes ne fonctionne pas, indépendamment du fait qu'il soit mis avec ou sans 'sys.path.append ('../ top_package /')' (s'il n'y a pas de modifications à l'actuel '__init__. py' fichiers comme indiqué ci-dessus – user3684314

Répondre

0

Eh bien, c'est une vieille question sur la structure d'un projet python. Mais je pense que le problème critique est que votre répertoire de travail actuel n'est pas le top_package. Donc, lorsque votre interprète veut rechercher top_package, cela dépasse la portée.

Ce n'est pas une bonne pratique, vous devriez toujours lancer votre projet avec un script situé dans le répertoire racine.Un projet python bien construit doit à l'exemple suivant:

project 
----src 
--------app.py 
--------modules 
------------__init__.py 
------------module.py 
----test 
--------test_cases.py 
----doc 
--------document.md 
----.gitignore 
----license.txt 
----readme.md 

Et vous devriez toujours lancer votre projet par python src/app.py, vous pouvez utiliser absolute import correctement.

Notez qu'il ne s'agit que d'un exemple très basique.

+0

er non, utilisez toujours 'python -m 'ou scripts générés par' setup.py' – o11c