Python/Django 导入错误的模块(相对的应该是绝对的)
我现在在用Django 1.2的预发布版本和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' 不是一个有效的标签库:无法从 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.3
在sys.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
(我可能不需要第二行。)
真是糟糕。