2010-05-11 9 views
4

désolé, je suis sûr que c'est demandé un tas, mais je ne pouvais pas le trouver.module de rechargement, besoin de recompiler les sous-modules?

dans myModule.py:

from myModule.subModule import myClass 

je travaille sur myClass, et je veux rester dans ma séance de ipython et de le tester. reload(myModule) ne recompile pas myClass.

comment puis-je faire cela?

Répondre

2

Vous devez répéter vos importations après avoir rechargé le sous-module "le plus à la feuille". Par exemple, étant donné:

$ mkdir myModule 
$ touch myModule/__init__.py 
$ cat >myModule/subModule.py 
class MyClass(object): kind='first' 

puis

>>> from myModule.subModule import MyClass 
>>> MyClass.kind 
'first' 

et dans un autre terminal

$ cat >myModule/subModule.py 
class MyClass(object): kind='second' 

puis ...:

>>> import sys 
>>> reload(sys.modules['myModule.subModule']) 
<module 'myModule.subModule' from 'myModule/subModule.py'> 
>>> from myModule.subModule import MyClass 
>>> MyClass.kind 
'second' 

Vous devez passer par sys.modules comme vous n'avez pas d'autre refe passer au sous-module, puis vous devez répéter le from.

La vie est beaucoup plus simple si vous acceptez les conseils judicieux d'importer toujours un module, jamais des choses à l'intérieur du module, bien sûr - par exemple, la session Python serait (avec un changement à la sous-module avant la reload):

>>> from myModule import subModule as sm 
>>> sm.MyClass.kind 
'first' 
>>> reload(sm) 
<module 'myModule.subModule' from 'myModule/subModule.py'> 
>>> sm.MyClass.kind 
'second' 

Si vous prenez l'habitude d'utiliser des noms qualifiés tels que sm.MyClass au lieu de seulement le barename MyClass, votre vie sera plus simple à bien des égards (plus facile est juste rechargement un d'entre eux ;-).

+0

ma classe n'a pas d'attribut kind. peut-être une chose python 3.0 (j'ai 2.6.4). De toute façon, j'ai suivi votre conseil sur l'utilisation de noms qualifiés pour les sous-modules et tout fonctionne. merci beaucoup. j'aime aussi votre livre de livre de python. alex – alex

+0

@alex, Je définis un attribut de manière à ce qu'il soit plus simple et plus facile de vérifier quelle version d'une classe est chargée - rien de spécial sur le nom et la valeur de l'attribut, juste un exemple. –

Questions connexes