最近在开发项目中,遇到一个文件,类似循环引用,但又不完全是。
形式如下,有两套一样的模块逻辑,每套都有一个run.py,还有一个pack.py,两个pack.py都引用了ref_comm.py模块。
#run1.py
import pack1
if __name__ == "__main__":
print("run 1")
#run2.py
import pack1
if __name__ == "__main__":
print("run 2")
#pack1.py
from ref_comm import C1
#pack2.py
from ref_comm import C2
#ref_comm.py
import pack1
import pack2
class C1:
pass
class C2:
pass
在ref_comm.py中使用import pack1和pack2,会对运行造成影响:例如运行run1.py,需要注释掉ref_comm.py中的import pack2,否则运行报错,说找不到pack2.C2。
ImportError: cannot import name 'C2' from partially initialized module 'ref_comm' (most likely due to a circular import)
一直以为是循环引用的问题,但是这里应该不完全是,主要是加载不完整导致的无法应用。
运行run1时,引用pack1,接着引用ref_comm,然后ref_comm反过来引用pack2,pack2又引用ref_comm里的C2,但是这使ref_comm尚未加载完成,C2还无法引用,所以pack2的执行就终止报错了。
如果把ref_comm.py里的import都挪到class C2定义的下方,运行就没有问题了,这也从侧面证实了问题产生的原因。
网友评论