我的项目结构如下:
project/
main.py
sub_a/
class_a.py
__init__.py
utils/
__init__.py
util_a.py
sub_b/
class_b.py
__init__.py
utils/
__init__.py
util_b.py
在class_a.py
,class_b.py
的每一个中,都有这样的导入:
from utils import util_a/b
我的PYTHONPATH
指向sub_a
和sub_b
。当我尝试
import class_b
在main.py
中,我收到一个ImportError:
ImportError: cannot import name util_b
我正在使用Python 2.7。
我了解到错误是由于from utils import util_b
含糊不清所致,因此Python选择了路径中的第一个,但是如何重写导入以使它们起作用?
我不认为更改PYTHONPATH
是一个选择,因为sub_a
和sub_b
中的每一个都假定它们是PYTHONPATH
中自己内部导入的一部分。例如,from utils import util_b
中的class_b.py
。
答案 0 :(得分:1)
不要将两个子目录都添加到PYTHONPATH
中。相反,仅向其中添加project
并导入sub_a.utils.util_a
和sub_b.utils.utils_b
。
(在包本身中,您可以使用relative imports从同一子树中导入内容。例如,在sub_b/__init__.py
中:import .utils.utils_b
)
根据isinstance fails for a type imported via package and from the same module directly,如果您添加子目录,则utils
软件包将与sys.path
上较早的软件包相关联,并且只要您尝试从{{ 1}}。
答案 1 :(得分:0)
您要查找的是“导入为”
很好的概述: 在另一个线程from ... import OR import ... as for modules'
中回答从project.sub_a导入用户作为aUser
从project.sub_b导入用户为bUser