2017-08-19 3 views
0

J'ai un programme python relativement faible qui est configuré comme celui-cimodule entier n'est pas détecté par __init__.py

Root 
    --Network 
    --DTO 
     Lots of py files which contain classes. 
    Other py files in the project 

Tant dans le réseau et le dossier DTO il y a un __init__.py vide. Lorsque je fais from Network import DTO, import Network, Import Network.DTO Je ne peux pas utiliser le module du tout. Le débogueur dit que c'est complètement vide. La racine contient le fichier py que je suis en train d'exécuter.

Les deux fichiers __init__.py dans le dossier Réseau et DTO sont compilés à pyc alors que tous les fichiers Python réels ne le sont pas.

Est-ce que quelqu'un a une idée de ce que je fais mal? J'utilise python 2.7

+0

Avez-vous essayé 'from Network.DTO import *' et voyez si quelque chose est disponible de cette façon? Si cela aide souvent à imprimer 'sys.path' dans le fichier py, vous êtes en train de l'exécuter après les importations. – JacobIRR

+0

@JacobIRR Non, cela ne fonctionne pas non plus :(Sys.path à la fois _init__.py contient le chemin de mon dossier racine –

+0

Si vous exécutez Python à partir d'un répertoire autre que Root, vous ne serez pas –

Répondre

1

Pour cela, vous devez importer les sous-modules dans votre __init__.py. Il devient plus difficile d'ajouter une importation pour chaque sous-module si vous en avez plusieurs, comme vous le faites. Dans le cas de nombreux sous-modules (et en général), utilisez __all__.

Voici un exemple pour Root/Network/DTO/__init__.py:

__all__ = [ 
    'sample_module', 
    ... 
] 

for module in __all__: 
    __import__('DTO.%s' % module) 

Maintenant, vous pouvez faire from Network.DTO import sample_module. La même idée vaut pour vos autres modules.

+0

Donc, vous ne pouvez pas avoir de sous-dossiers sans avoir une énorme quantité de comptabilité dans le __init__.py Je pensais que cela devrait simplement importer tout dans un dossier s'ils sont vides –

+0

'__all__' marque les modules qui sont" public "dans le module, donc un sous-module qui n'est utilisé que dans le projet ne sera pas inclus. Tout fichier de module peut aussi avoir un '__all__' pour inclure les classes/fonctions/variables" publiques "de ce module, ie dans' sample_module', je pourrais avoir les classes 'Foo' et' Bar', résultant en '__all__ = [ Foo , Bar] '. –