Question
Ceci est un cas normal d'importation mutuelle. Supposons que vous avez la configuration suivante
./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 sont une seule fois. Dans Grok, cela ne se produit pas. Supposons avoir le app.py suivant
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 cas et le second est que le premier montre l'importation progressive de e puis de m. Dans le second cas, il importe directement m.
Merci pour l'aide
La solution
Cela pourrait peut-être un effet secondaire de l'introspection ne Grok, je ne suis pas sûr.
Essayez de mettre un pdb.set_trace () en m, et vérifier la trace de la pile pour voir ce qui importe les modules.