Skip to main content
 首页 » 编程设计

Python/Django 正在导入错误的模块(相对的,当它应该是绝对的)

2025年05月04日6落叶无声

我正在使用 Django 1.2 pre-alpha 和 Python 2.4。是的,我知道,但我坚持下去。我们目前无法升级,我怀疑这就是答案。

我有两个模板标签库,foo 和bar。不过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并将所有模板标签库绑定(bind)到 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包(因为它已在本地 checkin 并正在逐步淘汰),但我拒绝修改bar -4.5 包(因为它是一个开源包并且已经在系统范围内安装)。

请您参考如下方法:

经过几个小时的黑客攻击,这成功了。

原代码:

from foo.conf import settings 

新代码:

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

(我可能不需要第二行。)

哇哦。