python - Python 中的循环导入及其解决方案
问题描述
我正在处理 Python 中的循环导入问题。由于解决了这个问题,我不得不更加了解 Python 中的包/导入。
我使用的一些资源包括:
https://docs.python.org/3/tutorial/modules.html
https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html
我知道这个话题已经被广泛讨论过,并且我已经尽我所能熟悉那个讨论,但是我有一个来自我们的代码库的最小工作示例,我还没有能够使用我从源代码中学到的技能来解决这个问题我上面引用的。我征求有关此示例的任何建议。
该示例的文件夹结构如下:
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 是什么有关。
感谢您对此问题的任何帮助。
解决方案
推荐阅读
- javascript - 从 Google Chrome 扩展程序中截取特定元素的屏幕截图
- python - 如何从现有数据框创建新数据框?
- tableau-api - 在 Tableau 中的列(或逗号分隔的列)中计算未知单词
- extractor - libarchive 完整提取器
- python - Tkinter 数据不打印
- html - 如何使用 .htaccess 将尾随“/”添加到网站
- python - 如何正确标准化地址类型
- javascript - 为什么我的 ForEach 执行而不被调用?反应器?
- spring-boot - JBoss EAP 7.1 + Spring Boot 应用程序:找不到约束“javax.validation.constraints.NotBlank”的验证器
- android - 如何将 gif 组合在一起制作一个场景?