我正在使用setuptools制作一个python包,在安装包后,我很难将源代码中的所有嵌套文件夹都导入。我正在工作的目录有一个如下所示的结构。
├── setup.py
└── src
└── foo
├── a
│ ├── aa
│ │ └── aafile.py
│ └── afile.py
├── b
│ └── bfile.py
└── __init__.py
目前,我无法导入子模块,如from foo.a import aa
或from 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
文件留空,用户将需要手动加载他想要的子包/子模块。