Ceci est un cas normal d'importation mutuelle. Supposons que vous ayez la mise en page suivanteDouble importation dans grok
./test.py
./one
./one/__init__.py
./one/two
./one/two/__init__.py
./one/two/m.py
./one/two/three
./one/two/three/__init__.py
./one/two/three/four
./one/two/three/four/__init__.py
./one/two/three/four/e.py
./one/two/u.py
Et vous avez
test.py
from one.two.three.four import e
un/deux/trois/quatre/e.py
from one.two import m
un/deux/m.py
print "m"
import u
un/deux/u.py
print "u"
import m
Lorsque vous exécutez le programme test.py, vous vous attendez, bien sûr:
python test.py
m
u
Quel est le comportement attendu. Les modules ont déjà été importés, et ils ne sont qu'une seule fois. Dans Grok, cela n'arrive pas. Supposons d'avoir la app.py suivante
import os; import sys; sys.path.insert(1,os.path.dirname(os.path.realpath(__file__)))
import grok
from one.two.three.four import e
class Sample(grok.Application, grok.Container):
pass
ce que vous obtenez lorsque vous exécutez Paster est:
$ bin/paster serve parts/etc/deploy.ini
2009-10-07 15:26:57,154 WARNING [root] Developer mode is enabled: this is a security risk and should NOT be enabled on production servers. Developer mode can be turned off in etc/zope.conf
m
u
m
u
Qu'est-ce qui se passe ici?
à partir d'une trace de pile pdb, les deux cas sont importés par martian:
/Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/core.py(204)grok_package()
-> grok_module(module_info, grokker, **kw)
/Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/core.py(209)grok_module()
-> grokker.grok(module_info.dotted_name, module_info.getModule(),
/Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/scan.py(118)getModule()
-> self._module = resolve(self.dotted_name)
/Users/sbo/.buildout/eggs/martian-0.11-py2.4.egg/martian/scan.py(191)resolve()
-> __import__(used)
La seule différence entre le premier boîtier et le second est que le premier représente l'importation progressive de e et de m. Dans le second cas, il importe directement m.
Merci pour l'aide
Est-ce que grok fait un rechargement automatique du code? La même chose se produit dans Werkzeug quand use_reloader = True. –
Oui, mais pas dans mon cas. vous devez ajouter un commutateur spécifique pour effectuer le rechargement, et dans tous les cas cela n'expliquerait pas la persistance des données. –