摘要:
导入类时(在下面的示例中为c2
)(folder1
),其中导入的类(c2
)导入类(c1
)来自同一软件包(folder1
),则程序(file2
)会在c2
上导入c1
时引发ModuleNotFoundError
,即使导入已在包中运行。
延伸:
该示例具有以下文件结构
project/
├── folder1/
│ └── __init__.py
│ └── file1.py
│ └── file2.py
└── folder2/
└── file3.py
其中folder1
中的文件包含以下类。__init__.py
保留为空。
(请注意,file2.py
上没有导入错误)
第一次folder2
中的文件导入类c2
# file3.py
import sys
sys.path.append('../') # to recognize folder1 as a package
from folder1.file2 import c2
但当我尝试运行file3.py
时,在file2.py
中导入c1
会引发ModuleNotFoundError
$ python3 file3.py
Traceback (most recent call last):
File "/home/user/project/folder2/file3.py", line 4, in <module>
from folder1.file2 import c2
File "/home/user/project/folder2/../folder1/file2.py", line 1, in <module>
from file1 import c1
ModuleNotFoundError: No module named 'file1'
请注意,我可以使用类似的导入from folder1.file1 import c1
在file3.py
上导入c1
,但不能使用c2
。
(Of当然,这是我发现这个问题的实际类的抽象,实际的文件夹布局很重要,但问题是一样的。)
如何在folder2/file3.py
上导入c2
?
我尝试在file3
上的c2
之前导入c1
,还尝试导入c1
(和/或c2
)在folder1/__init__.py
中但没有工作,我也试着把folder2/
做成一个包,并在它的__init__.py
中导入,但是没有成功。(可能)可以简单地连接file1
和file2
,或者尝试为file1
创建一个包,但我相信我在导入上做错了什么,必须有一个简单的方法来解决这个问题。
1条答案
按热度按时间fnx2tebb1#
将相同的正确完整路径添加到
file2.py
中的file1.py
:当
file2.py
试图导入file1.py
时,它试图从('../')
导入,其中没有file1.py
,只有/folder1
和/folder2
。如果你使用的是python 3.3+,你可以删除
__init__.py
。