Python自建包导入路径

标签 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的路径不同吗?

最佳答案

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

尝试运行同样的事情

from .sub_pkg import sub_pkg_a

本例中的点指的是“相对于导入所在的文件”,在本例中是相对于 main.py 的位置

这篇文章很好地解释了它 https://realpython.com/absolute-vs-relative-python-imports/

关于Python自建包导入路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58604289/

相关文章:

python - 改变和 reshape numpy 数组?

python - 如何优化o(n**2)算法成为o(nlogn)或o(n)?

python - Pandas .iloc[] 不适用于索引范围

python - 为什么我必须从 BytesIO 转换字节,然后再转换回 BytesIO,以便可以将其读取为 PDF 文件响应?

Python 使用子数组动态构建 JSON

python - 如何使用 openCV 在 Python 中提高视频播放速度

python - 合并 hdf5 文件

python - Seaborn 中的黑白箱线图

python - Facebook/messenger 存档包含我无法解析的表情符号

python - 如何提高FastAPI中的GET查询性能?