這是一個相互導入的正常情況。假設你有以下佈局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
而且你
test.py
from one.two.three.four import e
一/二/三/四/ e.py
from one.two import m
一個/ two/m.py
print "m"
import u
一/二/ u.py
print "u"
import m
當您運行test.py程序,你想到的,當然:
python test.py
m
u
這是預期的行爲。模塊已經被導入,並且只有一次。在Grok中,這不會發生。假設有以下app.py
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
當您運行得到自己貼紙是:
$ 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
這是怎麼回事會在這裏?
從PDB堆棧跟蹤,這兩種情況下都受到火星的輸入:
/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)
所述第一殼體和第二個之間的唯一區別在於,第一顯示e的漸進進口和然後的米。在第二種情況下,它直接輸入m。
感謝您的幫助
Grok做自動代碼重裝嗎?當use_reloader = True時,Werkzeug發生同樣的事情。 – 2009-10-07 16:22:51
是的,但不是在我的情況。你必須添加一個特定的開關來執行重新加載,並且在任何情況下它都不能解釋數據的持久性。 – 2009-10-07 16:24:19