下面是我正在使用的文件结构:
package_example/
main.py
the_package/
__init__.py
pkg_file_1.py
pkg_file_2.py
文件如下:
# main.py
from the_package.pkg_file_1 import foo_1
def main():
foo_1()
if __name__ == "__main__":
main()
# pkg_file_1.py
from the_package import pkg_file_2
def foo_1():
print("this is the second version, foo_1")
pkg_file_2.foo_2()
if __name__ == "__main__":
foo_1()
# pkg_file_2.py
def foo_2():
print("this is foo_2")
如果我运行main.py
,一切正常。
但是如果我运行pkg_file_1.py
,我得到:
Traceback (most recent call last):
File "the_package/pkg_file_1.py", line 1, in <module>
from the_package import pkg_file_2
ModuleNotFoundError: No module named 'the_package'
显然,在这个简化的示例中,这无关紧要,因为main.py
和pkg_file_1.py
运行相同的代码。
但是实际上,我在包结构中嵌入了测试脚本,所以我可以在新的环境和数据中测试代码。但是我很挠头,我应该如何编写import语句,这样我就不会从包内或包外获得ModuleNotFoundError
。
编辑:根据pavel的建议,我尝试将pkg_file_1.py
更改为:
from ..the_package import pkg_file_2
def foo_1():
print("this is the second version, foo_1")
pkg_file_2.foo_2()
if __name__ == "__main__":
foo_1()
但是运行相同的文件会得到:
Traceback (most recent call last):
File "the_package/pkg_file_1.py", line 1, in <module>
from ..the_package import pkg_file_2
ImportError: attempted relative import with no known parent package
这就是为什么我们需要相对导入。
# pkg_file_1.py
from . import pkg_file_2
...
如何运行main.py
和pkg_file1.py
从package_example
dir:
python3 main.py
python3 -m the_package.pkg_file1