Python/Django 导入了错误的模块(相对的模块应该是绝对的)

2023-12-13

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

我有两个模板标签库,foo and 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.

But no:

TemplateSyntaxError:“bar”不是有效的标签库:无法从 django.templatetags.bar 加载模板库,没有名为 conf 的模块

不幸的是,Django 执行一点魔法并将所有模板标签库绑定到django.templatetags.*. Thus, bar正在导入为django.templatetags.bar,当它调用时from foo.conf import settings它最终导入bar-4.5/somepackage/templatetags/foo.py. Ugh!

您有任何想法如何解决这个问题吗?

我在导入之前设置了一个断点,并且我已经确认foo-1.2.3是在开始时sys.path,但是import仍然发现关键字错误foo.

如果有帮助的话,请注意我可以修改foo-1.2.3包(因为它已经在本地签入并且正在逐步淘汰),但我拒绝修改bar-4.5包(因为它是一个开源包并且已在系统范围内安装)。


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

原始代码:

from foo.conf import settings

新代码:

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

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

Ewww.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python/Django 导入了错误的模块(相对的模块应该是绝对的) 的相关文章

随机推荐