模块被多次导入

5 投票
2 回答
5218 浏览
提问于 2025-04-16 11:13

我在一个模块第一次加载的时候会做一些初始化的工作。问题是,这个模块居然被导入了两次,我搞不清楚为什么。我想可能是因为用不同的路径导入了,就像这个例子:

a.py:

from apps.blog import models
...

b.py:

from blog import models
...

我在我的模块里插入了print __name__,结果它打印出了blog.models两次,所以问题并不是出在导入路径上。
那么,还有其他什么原因会导致一个模块被多次导入吗?

更新:
我没提到我在用django。我觉得这个问题和django的manage.py脚本有关:https://docs.djangoproject.com/en/dev/releases/1.4/#updated-default-project-layout-and-manage-py

2 个回答

2

这里有一篇关于Django中settings.py多次导入的很不错的讨论,链接是http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

10

通常情况下,Python 不应该重复导入一个模块,无论是用绝对路径还是相对路径。出现这种情况的可能原因是,Python 可能把源文件当成了两个不同的文件,因此分别导入了它们。这种情况可能是因为有符号链接的文件或目录,或者是有不同版本的文件并排存在,或者是 PYTHONPATH 中有重叠的目录,具体原因很难说。

要找出问题所在,可以使用交互式调试器。你可以在文件的最上面加一行代码 import pdb; pdb.set_trace(),然后在交互式命令行中输入 bt,这样可以查看导入的调用链。接着输入 c 继续执行。当文件第二次被导入并且调试器被激活时,再次尝试输入 bt,对比两次的输出,这可能会帮助你找到问题所在。

撰写回答