2010-12-23 34 views
2

我使用Django 1.2 pre-alpha和Python 2.4。是的,我知道,但我堅持下去。目前我們無法升級,無論如何我懷疑這是答案。Python/Django導入錯誤的模塊(相對應該是絕對的)

我有兩個模板標籤庫foobar。然而,foo也是頂級包的名稱,它恰好是bar包:

foo-1.2.3/ 
    foo/ 
    conf/ 
     settings.py 
    templatetags/ 
     bar.py 

bar-4.5/ 
    somepackage/ 
    templatetags/ 
     foo.py 

標籤庫bar.py包含這樣一行:

from foo.conf import settings 

.. 。你會期望它加載foo-1.2.3/foo/conf/settings.py

但是,沒有:

TemplateSyntaxError: 'bar' is not a valid tag library: Could not load template library from django.templatetags.bar, No module named conf

不幸的是,Django的執行a little magic並結合所有的模板標籤庫django.templatetags.*。因此,bar正在導入爲django.templatetags.bar,並且它在調用from foo.conf import settings時最終導入了bar-4.5/somepackage/templatetags/foo.py。啊!

你有什麼想法如何解決這個問題?

我設置導入之前斷點正確的,我已經證實,foo-1.2.3是在sys.path開始,但import關鍵字還發現錯誤foo

如果有幫助,請注意,我可以修改foo-1.2.3包(因爲它在本地被檢查,被淘汰),但我拒絕修改bar-4.5包(因爲它是一個開放源碼包,並已安裝全系統)。

+0

重命名`foo /`?順便說一句,在Python> = 2.5,你可以使用從`__future__ import absolute_import` http://docs.python.org/release/2.5/whatsnew/pep-328.html☃ – jfs 2010-12-23 20:36:16

回答

1

經過幾個小時的黑客攻擊之後,這個技巧就完成了。

原始代碼:

from foo.conf import settings 

新代碼:(我可能不需要第二行)

foo = __import__('foo') 
conf = __import__('foo.conf').conf 
settings = __import__('foo.conf.settings').conf.settings 

EWWW。

+0

哇,這是令人厭惡,顯然是在Django的設計缺陷! – 2010-12-23 23:00:49