Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅导入模块时的Python导入周期_Python_Import_Circular Dependency - Fatal编程技术网

仅导入模块时的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,那么更改它是一种很好的方法。