首页 > 解决方案 > Python 中的循环导入及其解决方案

问题描述

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

我使用的一些资源包括:

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

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

如何避免 Python 中的循环导入?

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/Source要放置Package在 sys 路径中。

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

a.py 从 b1.py 加载一个类,它从 b2.py 加载一个方法,从 c1.py 加载一个类,从 c2.py 加载一个类,从 b1.py 加载一个类(即与 a.py 相同的类)。 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 是什么有关。

感谢您对此问题的任何帮助。

标签: pythonpython-3.x

解决方案


推荐阅读