什么会导致python模块被导入两次?

什么会导致python模块被导入两次?,python,module,import,Python,Module,Import,据我所知,python模块从来不会被导入两次,即模块中的代码只在第一次导入时执行。后续的导入语句只是将模块添加到导入的范围中 我有一个名为“TiledConvC3D.py”的模块,它似乎被导入了多次。我使用pdb打印此模块代码顶部的堆栈 以下是第一次执行模块时的堆栈跟踪结束: File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 328, in refresh key = cPickle.loa

据我所知,python模块从来不会被导入两次,即模块中的代码只在第一次导入时执行。后续的导入语句只是将模块添加到导入的范围中

我有一个名为“TiledConvC3D.py”的模块,它似乎被导入了多次。我使用pdb打印此模块代码顶部的堆栈

以下是第一次执行模块时的堆栈跟踪结束:

File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 328, in refresh
  key = cPickle.load(open(key_pkl, 'rb'))
File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>
  import TiledConvC3D
File "<anonymized>/ops/TiledConvC3D.py", line 18, in <module>
  pdb.traceback.print_stack()
此外,我还检查了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。在我的主脚本开始时,我导入
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
并在执行任何其他导入之前打印id(\uuuuu内置\uuuuu.import\uuuuuu)
,并且id的值不变


除了调用reload和overriding
\uuuuuu builtin\uuuuu.\uuuuu import\uuuuuu
之外,还有其他机制可以解释我的模块被多次加载的原因吗?

如果在路径中发现两次模块,Python模块可以被导入两次。例如,假设项目的布局如下:

  • src/
    • 包装1/
      • spam.py
      • 鸡蛋
假设PYTHONPATH(sys.path)包含src和src/package1:

PYTHONPATH=/path/to/src:/path/to/src/package1
如果是这种情况,您可以像这样导入同一模块两次:

from package1 import spam
import spam
Python会认为它们是不同的模块。这是怎么回事


此外,根据下面的讨论(对于搜索此问题的用户),可以两次导入模块的另一种方法是在第一次导入的中途出现异常。例如,如果垃圾邮件导入鸡蛋,但导入鸡蛋会导致模块内部出现异常,则可以再次导入该鸡蛋。

这是一个很好的观点,但我认为在这种情况下不会发生这种情况。正如您在堆栈跟踪中所看到的,在这两种情况下,模块都是使用相同的语句导入的:“import TiledConvC3D”导入是否可能在第一次导入中途失败?例如,如果在导入模块的过程中出现异常?是的,这就是问题所在。我没有意识到在try语句中允许导入。我受到了双路径问题的影响,来到这里-感谢您在这里提供了这个!在您的示例中,导入垃圾邮件的每种方法的
sys.modules
中的键是什么?你能链接到一些文档(比如)吗?
from package1 import spam
import spam