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

2 投票
1 回答
1073 浏览
提问于 2025-04-16 08:58

我现在在用Django 1.2的预发布版本和Python 2.4。是的,我知道这很老旧,但我现在没办法升级,估计这也不是问题的关键。

我有两个模板标签库,分别叫做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' 不是一个有效的标签库:无法从 django.templatetags.bar 加载模板库,找不到模块 conf

不幸的是,Django做了一些“魔法”,把所有的模板标签库都绑定到了django.templatetags.*。所以,bar被当作django.templatetags.bar来导入,当它调用from foo.conf import settings时,结果却导入了bar-4.5/somepackage/templatetags/foo.py。真是让人无奈!

你有什么想法可以解决这个问题吗?

我在导入之前设置了一个断点,确认foo-1.2.3sys.path的最前面,但import关键字还是找到了错误的foo

如果有帮助的话,我可以修改foo-1.2.3这个包(因为它是本地的,正在逐步淘汰),但我不想修改bar-4.5这个包(因为它是开源的,已经全局安装了)。

1 个回答

1

经过几个小时的努力,这个方法终于奏效了。

原来的代码:

from foo.conf import settings

新的代码:

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

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

真是糟糕。

撰写回答