正确的方式启用导入python包中的所有子模块



我正在使用setuptools制作一个python包,在安装包后,我很难将源代码中的所有嵌套文件夹都导入。我正在工作的目录有一个如下所示的结构。

├── setup.py
└── src
└── foo
├── a
│   ├── aa
│   │   └── aafile.py
│   └── afile.py
├── b
│   └── bfile.py
└── __init__.py

目前,我无法导入子模块,如from foo.a import aafrom foo.a.aa import some_method,除非我明确地将子模块的名称传递给setuptools。也就是说,setup.py需要包含类似的内容

from setuptools import setup
setup(
version="0.0.1",
name="foo",
py_modules=["foo", "foo.a", "foo.a.a", "foo.b"],
package_dir={"": "src"},
packages=["foo", "foo.a", "foo.a.a", "foo.b"],
include_package_data=True,
#  more arguments go here
)

这使得组织代码变得非常麻烦。有没有一种简单的方法可以让包的用户安装src/foo中包含的任何子模块?

您将需要setuptools.find_packages()–尽管总的来说,您可能需要考虑将setup.py完全丢弃,以支持PEP 517风格的构建,该构建没有任意Python,只有pyproject.toml(可能还有setup.cfg(。

from setuptools import setup, find_packages
setup(
version="0.0.1",
name="foo",
package_dir={"": "src"},
packages=find_packages(where='src'),
include_package_data=True,
)

每个包/子包都必须包含一个(至少为空(__init__.py文件才能被认为是这样。

如果你想整包&只使用一个import foo导入的子包树考虑使用相关子包的导入来填充__init__.py文件。

# src/foo/__init__.py
import foo.a
import foo.b
# src/foo/a/__init__.py
import foo.a.aa
# src/foo/b/__init__.py
import foo.b.bb

否则,将__init__.py文件留空,用户将需要手动加载他想要的子包/子模块。

最新更新