Python自行创建的包导入路径

时间:2019-10-29 09:10:40

标签: python

(已解决) 此链接https://dev.to/codemouse92/dead-simple-python-project-structure-and-imports-38c6解释了Python的结构并很好地导入了该文件。

我已经创建了一个Python软件包test_pkg

test_pkg/
├── setup.py
└── test_pkg
    ├── __init__.py
    ├── main.py
    └── sub_pkg
        ├── __init__.py
        └── sub_pkg_a.py

main.py中,将导入子包中的模块, 但我必须明确地写:

from test_pkg.sub_pkg import sub_pkg_a

否则,如果我只写:

from sub_pkg import sub_pkg_a

Python将报告:

>>> import test_pkg.main
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/zheng/tests/test_pkg/test_pkg/main.py", line 2, in <module>
    from sub_pkg import sub_pkg_a
ModuleNotFoundError: No module named 'sub_pkg'

您能否告诉我为什么需要包名称:test_pkg.sub_pkg

相对导入在该程序包中工作正常,但是如果我直接执行main.py脚本,则会出现另一个导入错误:

~/tests/test_pkg/test_pkg$ python3 main.py 
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    from .sub_pkg import sub_pkg_a
ModuleNotFoundError: No module named '__main__.sub_pkg'; '__main__' is not a package

因此,问题是:__init__.sub_pkg__main__.sub_pkg的路径是否不同?

1 个答案:

答案 0 :(得分:2)

这里需要使用的是相对导入。

尝试使用

运行相同的内容
from .sub_pkg import sub_pkg_a

在这种情况下,点是指“相对于导入所在的文件”,在这种情况下,是相对于main.py的位置

本文很好地说明了https://realpython.com/absolute-vs-relative-python-imports/