我正在处理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/Source
将Package
放入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有关。
感谢您提供有关此问题的帮助。