Python中的循环导入及其解析

时间:2019-02-26 20:06:24

标签: python python-3.x

我正在处理Python中的循环导入问题。解决这个问题的结果是,我不得不变得更加了解Python中的包/导入。

我使用的一些资源包括:

https://docs.python.org/3/tutorial/modules.html

https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html

How to avoid circular imports in Python?

Circular (or cyclic) imports in Python

我知道这个话题已经广泛讨论,并且尽我所能熟悉该讨论,但是我从代码库中获得了一个最低限度的工作示例,我尚无法使用我学到的技能来解决这个问题。从我上面引用的来源我要求有关此示例的任何建议。

该示例的文件夹结构如下:

Source/
    Package/
        __init__.py
        A/
            __init__.py
            a.py
        B/
            __init__.py
            b1.py
            b2.py
        C/
            __init__.py
            c1.py
            c2.py  

每个__init__.py为空。每个文件的内容如下:

a.py

from Package.B.b1 import class_b1

b1.py

from Package.B.b2 import method_b2

class class_b1(object):
    def __init__(self):
        pass

b2.py

from Package.C.c1 import class_c1

def method_b2():
    pass

c1.py

import Package.C.c2 as class_c2

class class_c1(object):
   def __init__(self):
        pass

c2.py

from Package.B.b1 import class_b1

class class_c2(object):
    def __init__(self):
        pass

逻辑如下。 我export PYTHONPATH=/path/to/SourcePackage放入sys路径。

然后我去Package/A并执行python a.py

a.py从b1.py加载一个类,从b2.py加载一个方法,从b1.py加载一个类,从c2.py加载一个类,从c2.py加载一个从b1.py加载的类(即相同的类)该a.py已加载)。结果是ImportError

请注意,所有这些操作都是在Ubuntu 16.04中已激活的python 3.6.5虚拟环境中完成的。

以下是痕迹:

(eye_tracking) gsandh16@count:~/Documents/PythonImportTesting/MWE_refactored/Source/Package/A$ python a.py 
Traceback (most recent call last):
  File "a.py", line 1, in <module>
    from Package.B.b1 import class_b1
  File "/home/gsandh16/Documents/PythonImportTesting/MWE_refactored/Source/Package/B/b1.py", line 1, in <module>
    from Package.B.b2 import method_b2
  File "/home/gsandh16/Documents/PythonImportTesting/MWE_refactored/Source/Package/B/b2.py", line 1, in <module>
    from Package.C.c1 import class_c1
  File "/home/gsandh16/Documents/PythonImportTesting/MWE_refactored/Source/Package/C/c1.py", line 1, in <module>
    import Package.C.c2 as class_c2
  File "/home/gsandh16/Documents/PythonImportTesting/MWE_refactored/Source/Package/C/c2.py", line 1, in <module>
    from Package.B.b1 import class_b1
ImportError: cannot import name 'class_b1'

我想解决此问题,而无需重构代码或在方法调用中保留导入(例如,当他们实际使用导入的程序包时)。我已经尝试通过获取当前文件的位置,将各种绝对导入,相对导入,追加到sys.path中。我的直觉告诉我,它与程序运行时的sys.path有关。

感谢您提供有关此问题的帮助。

0 个答案:

没有答案