2017-09-15 5 views
3

Avec la structure dir suivantepython dossier racine d'importation et d'utiliser tous les sous-dossiers

. 
├── setup.py 
└── yourpackage 
    ├── __init__.py 
    ├── some_module.py 
    ├── other_module.py 
    └── sub_package 
     ├── __init__.py 
     └── more_modules.py 

Est-il possible de le faire:

>> import yourpackage as yp 
>> yp.some_module.bar() 
>> yp.sub_package.more_modules.foo() 

où le contenu de some_module est

def bar(): print('bar') 

où le contenu de more_modules est

def foo(): print('foo') 

Je ne peux pas sembler obtenir ce travail

EDIT: L'erreur que je recevrais dans le premier cas est

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
AttributeError: module 'yourpackage' has no attribute 'some_module' 

Dans le second cas, il y a une erreur semblable, mais avec more_modules

+0

De quel fichier exécutez-vous le code? –

+0

De l'interpréteur Python à la racine. Je fais un 'pip install -e .' d'abord – shadi

+0

S'il vous plaît mentionner l'erreur que vous obtenez dans la question –

Répondre

0

à poil sur la réponse de @ A.Joly et @slallum: En fait, j'ai trouvé une combinaison de leurs méthodes fonctionne réellement.J'ai créé ces:

pycharmprojects 
    |_networkxy 
     |_ main_run.py ---- misleading name, it's just an ordinary file 
     |_ more_module.py 
     |_ __init__.py 

contenu de __init__.py:

from . import main_run 
from . import more_module 
contenu

de main_run.py:

def some_module(): 
    print('some module') 

contenu de more_module.py:

def more_module(): 
    print('more module') 

Maintenant, au répertoire pycharmprojects, dans la ligne de commande:

(C:\Users\Name\.conda\envs\my_root) C:\Users\Name\PycharmProjects>python 
Python 3.6.0 |Anaconda custom (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import networkxy 
>>> networkxy.main_run.some_module() 
some module 
>>> networkxy.more_module.more_module() 
more module 

Note: pour certaines raisons, je ne peux pas faire import main_run dans __init__.py, mais le from . import * semble fonctionner.

+0

Merci! Pendant tout ce temps, ce qui me manquait était 'from. import some_module'. Btw 'de. import * 'ne travaillait pas pour moi – shadi

0

Les importations sont assez difficile en fait ...

vous pouvez faire comme suit:

import yourpackage as yp 
from yourpackage import some_module #yp does not work 

appel à ipython:

In [8]: yp.some_module.bar() 
bar 

puis

import yourpackage.sub_package 
from yourpackage.sub_package import more_modules 

appel à ipython:

In [20]: yp.sub_package.more_modules.foo() 
foo 

Vous devez importer paquet haut ... puis sous-paquets

Voici un lien intéressant: https://www.codementor.io/sheena/python-path-virtualenv-import-for-beginners-du107r3o1

et celui-ci aussi bien :): https://docs.python.org/2/tutorial/modules.html

+0

donc ça ne marcherait pas sans appeler explicitement 'depuis votre paquetage import some_module'? – shadi

+0

oui, à moins que vous ne le fassiez: de l'importation de votre colis *, ce qui est la pire chose à faire. Bien que je ne l'ai pas essayé ici, je ne suis pas sûr que cela fonctionne avec des sous-paquets. –

1

Si vous souhaitez utiliser les modules internes sans les importer vous avez explicitement les importer dans le fichier __init__.py:

import some_module 
import other_module 
import sub_package 

et sub_package/__init__.py:

import more_modules 

Non Cela pourrait rendre la première importation du module plus lente.

option Autre est de les importer explicitement dans votre code:

>> import yourpackage.some_module 
>> import yourpackage.sub_package.more_modules 
>> yourpackage.some_module.bar() 
>> yourpackage.sub_package.more_modules.foo() 
+0

quand j'utilise 'import some_module' dans' __init __. Py', j'obtiens l'erreur 'ImportError: aucun module nommé 'some_module'' – shadi