什么可能导致python模块导入两次?
问题描述:
据我所知,python模块永远不会被导入两次,即模块中的代码只在第一次被导入时被执行。随后的导入语句只是将该模块添加到导入的范围。什么可能导致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()
它接着被执行数次。但是,完整的堆栈跟踪它被称为不显示任何来电reload
第二次,所以这些执行不应该发生:
File "sup_train_conj_grad.py", line 103, in <module>
dataset = Config.get_dataset(dataset_node)
File "<anonymized>/Config.py", line 279, in get_dataset
from datasets import NewWiskott
File "<anonymized>/datasets/NewWiskott.py", line 16, in <module>
normalizer_train = video.ContrastNormalizer3D(sigma, global_per_frame = False, input_is_5d = True)
File "<anonymized>/util/video.py", line 204, in __init__
self.f = theano.function([input],output)
File "<anonymized>/python_modules/Theano/theano/compile/function.py", line 105, in function
allow_input_downcast=allow_input_downcast)
File "<anonymized>/python_modules/Theano/theano/compile/pfunc.py", line 270, in pfunc
accept_inplace=accept_inplace, name=name)
File "<anonymized>/python_modules/Theano/theano/compile/function_module.py", line 1105, in orig_function
fn = Maker(inputs, outputs, mode, accept_inplace = accept_inplace).create(defaults)
File "/u/goodfeli/python_modules/Theano/theano/compile/function_module.py", line 982, in create
_fn, _i, _o = self.linker.make_thunk(input_storage = input_storage_lists)
File "<anonymized>/python_modules/Theano/theano/gof/link.py", line 321, in make_thunk
output_storage = output_storage)[:3]
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1178, in make_all
output_storage = node_output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 774, in make_thunk
cthunk, in_storage, out_storage, error_storage = self.__compile__(input_storage, output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 723, in __compile__
output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1037, in cthunk_factory
module = get_module_cache().module_from_key(key=key, fn=self.compile_cmodule)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 59, in get_module_cache
return cmodule.get_module_cache(config.compiledir)
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 576, in get_module_cache
_module_cache = ModuleCache(dirname, force_fresh=force_fresh)
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 268, in __init__
self.refresh()
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 326, in refresh
key = cPickle.load(open(key_pkl, 'rb'))
File "<anonymized>/ops/TiledConvV3D.py", line 504, in <module>
import TiledConvG3D
File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>
import TiledConvC3D
File "<anonymized>/ops/TiledConvC3D.py", line 22, in <module>
pdb.traceback.print_stack()
此外,我还检查__builtin__.__import__
的ID。在我的主要脚本的开头,我进口__builtin__
并打印id(__builtin__.__import__)
之前做任何其他进口。我也在我的模块里打印了多次导入id(__builtin__.import__)
,并且id的值没有改变。
除了调用重载和覆盖__builtin__.__import__
,还有其他的机制可以解释我的模块多次加载吗?
答
如果在路径中找到两次模块,则可以导入Python模块两次。例如,假设你的项目布局,像这样:
- 的src/
- 包1/
- spam.py
- eggs.py
- 包1/
假设你的PYTHONPATH(sys.path)包含src和src/pac kage1:
PYTHONPATH=/path/to/src:/path/to/src/package1
如果是这样的话,你可以导入相同的模块两次这样的:
from package1 import spam
import spam
和Python会认为他们是不同的模块。这是怎么回事?
此外,根据下面的讨论(用于搜索此问题的用户),另一种模块可以导入两次的方式是在第一次导入中途出现异常。例如,如果垃圾邮件导入鸡蛋,但导入鸡蛋会导致模块内的异常,则可以再次导入鸡蛋。
这是一个好点,但我不认为这就是发生在这种情况。正如你可以在栈跟踪中看到的那样,在这两种情况下模块都被导入了相同的语句:“import TiledConvC3D” – 2011-01-25 20:52:50