2016-02-28 1 views
3

J'ai la structure du projet suivant:Dynamiquement Module python import

python/ 
..core/ 
..envs/ 
    ..default/ 
    ....__init__ 
    ....default.py 
    ..dev1/ 
    ....__init__ 
    ....dev1.py 
dynamic_inventory.py 

dans dev1 j'ai les suivantes:

from ..default.default import BaseInventory 

dans dynamic_inventory:

import inspect 
from envs.dev1 import dev1 
print inspect.getmembers(dev1, inspect.isclass) 

il me donne bon code :

> [('BaseInventory', <class 'envs.default.default.BaseInventory'>), 
> ('BatchProcessor', <class 'envs.dev1.dev1.BatchProcessor'>), ... 

mais dynamique:

import inspect 

sys.path.append("python/envs") 
m = __import__("dev1") 
print inspect.getmembers(m, inspect.isclass) 

gives me: []

comment faire module d'importation dynamique?

Merci!

Répondre

4

Il y a deux problèmes avec votre code.

Tout d'abord, lorsque vous écrivez from envs.dev1 import dev1, vous importez dev1 à partir du package envs.dev1. Mais avec __import__("dev1"), vous l'importez en tant que module autonome.

Deuxièmement: avec sys.path.append("python/envs"); __import__("dev1") que vous importez python/envs/dev1/__init__.py, car le répertoire python/envs contient le répertoire dev1. Mais vous voulez le fichier python/envs/dev1/dev1.py. C'est pourquoi vous obtenez une liste vide: votre __init__.py ne définit aucune classe.

Mettre tout ensemble:

import inspect 

# no sys.path manipulation 
dev1 = __import__('envs.dev1.dev1', fromlist=['dev1']) 
print inspect.getmembers(dev1, inspect.isclass) 
+0

Merci pour votre aide! –