2009-10-07 50 views
0

這是一個相互導入的正常情況。假設你有以下佈局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。

感謝您的幫助

+0

Grok做自動代碼重裝嗎?當use_reloader = True時,Werkzeug發生同樣的事情。 – 2009-10-07 16:22:51

+0

是的,但不是在我的情況。你必須添加一個特定的開關來執行重新加載,並且在任何情況下它都不能解釋數據的持久性。 – 2009-10-07 16:24:19

回答

0

這也可能會被內省神交做的副作用,我不知道。

嘗試在m中放置pdb.set_trace(),並檢查堆棧跟蹤以查看導入模塊的內容。

+0

看來,這是由於我的策略導入包。我正在解決這個問題,但仍然是一個相當不正常的行爲。我發現它是因爲其中一個模塊將一個字典中的條目推入,如果引入了副本,則引發該條目,並且當第二個導入發生時,我會得到一個異常。 – 2009-10-07 14:04:58