仅导入模块时的Python导入周期
我知道这个问题在这里被问了无数次,但我已经被这个问题困扰了很长时间,一直无法在网上找到解决方案 我有一个导入周期,下面是堆栈跟踪:仅导入模块时的Python导入周期,python,import,circular-dependency,Python,Import,Circular Dependency,我知道这个问题在这里被问了无数次,但我已经被这个问题困扰了很长时间,一直无法在网上找到解决方案 我有一个导入周期,下面是堆栈跟踪: Traceback (most recent call last): File "openldap_lookup.py", line 2, in <module> import pure.directory_service.ds_lookup as dsl File "/home/myname/purity/tools/pure/dire
Traceback (most recent call last):
File "openldap_lookup.py", line 2, in <module>
import pure.directory_service.ds_lookup as dsl
File "/home/myname/purity/tools/pure/directory_service/ds_lookup.py", line 8, in <module>
import pure.authorization.auth as auth
File "/home/myname/purity/tools/pure/authorization/auth.py", line 16, in <module>
import auth_unix as auth_impl
File "/home/myname/purity/tools/pure/authorization/auth_unix.py", line 17, in <module>
import pure.directory_service.ad_lookup as ad_lookup
File "/home/myname/purity/tools/pure/directory_service/ad_lookup.py", line 1, in <module>
import pure.authorization.auth as auth
AttributeError: 'module' object has no attribute 'auth'
ds_lookup.py
import ds_lookup
def openldap_foo():
print ds_lookup.ds_foo
print 'openldap_lookup importing ds_lookup'
import auth as au
def ds_foo():
print au.auth_foo
print 'ds_lookup importing auth'
import auth as au
def ad_foo():
print au.auth_foo
print 'ad_lookup importing auth'
auth.py
import auth_unix
def auth_foo():
print auth_unix.auth_unix_foo
print 'auth importing auth_unix'
auth_unix.py
import ad_lookup
def auth_unix_foo():
print ad_lookup.ad_foo
print 'auth_unix importing ad_lookup'
ad_lookup.py
import ds_lookup
def openldap_foo():
print ds_lookup.ds_foo
print 'openldap_lookup importing ds_lookup'
import auth as au
def ds_foo():
print au.auth_foo
print 'ds_lookup importing auth'
import auth as au
def ad_foo():
print au.auth_foo
print 'ad_lookup importing auth'
但python并没有抱怨:
myname@myname-mbp:~/cycletest$ python openldap_lookup.py
ad_lookup importing auth
auth_unix importing ad_lookup
auth importing auth_unix
ds_lookup importing auth
openldap_lookup importing ds_lookup
myname@myname-mbp:~/cycletest$
我不是python专家,但我知道是导入周期导致了错误。但是为什么小测试文件不会出现同样的错误呢?导入周期在python中何时合法,何时不合法?我能做些什么来解决这个问题
我非常感谢python专家的帮助
既然很多人都会问,为什么我会有这样的循环呢 openldap_查找和ad_查找都包含ds_查找中基类的子类。ds\U查找需要来自auth的常量。auth需要auth_unix作为实现,auth_unix依次调用openldap_查找和ad_查找实现
我很想将常量从auth中移出并删除循环,但这段代码是大型git repo的一部分,其中数百个文件依赖于auth中的常量和方法,如果可能的话,我希望避免重构所有这些常量和方法。事实上,您不仅仅是导入模块,而是从包中导入模块,而您的测试用例实际上并没有反映这一点 我认为问题在于,在您第一次导入pure.authorization.auth时,解释器仍在构建pure.authorization模块(它尚未将auth绑定到pure.authorization,因为它尚未完成导入auth),因此第二次遇到此问题时,它会找到pure.authorization模块,但它还没有全局变量auth
至于打破这个循环,auth真的需要立即导入auth_unix吗,或者可以推迟到您真正需要auth实现时再导入吗?实际上,您不仅仅是导入模块,而是从包中导入模块,您的测试用例实际上并没有反映这一点 我认为问题在于,在您第一次导入pure.authorization.auth时,解释器仍在构建pure.authorization模块(它尚未将auth绑定到pure.authorization,因为它尚未完成导入auth),因此第二次遇到此问题时,它会找到pure.authorization模块,但它还没有全局变量auth
至于打破这个循环,auth真的需要立即导入auth_unix吗,还是可以推迟到真正需要auth实现时再导入呢?As auth部分就是问题所在。删除它,它就会正常工作。您完全正确地认为,将最后一个“import pure.authorization.auth as auth”(来自ad_查找的那一个)更改为“import pure.authorization.auth as auth”将不会在此处发生错误,但如果模块级别需要auth,则可能会在稍后发生错误。例如,紧接着导入之后的“auth=pure.authorization.auth”仍然会失败。但是,如果只在函数内部查找和使用auth,那么改变这一点是一个很好的方法。删除它,它就会正常工作。您完全正确地认为,将最后一个“import pure.authorization.auth as auth”(来自ad_查找的那一个)更改为“import pure.authorization.auth as auth”将不会在此处发生错误,但如果模块级别需要auth,则可能会在稍后发生错误。例如,紧接着导入之后的“auth=pure.authorization.auth”仍然会失败。但是,如果只在函数内部查找和使用auth,那么更改它是一种很好的方法。