在setup.py中自动发现Python子包

时间:2019-05-18 17:10:25

标签: python setuptools setup.py

我具有以下项目结构:

project_dir
├── my_package
│   ├── subpackage
│   │   ├── bar.py
│   │   └── __init__.py
│   ├── foo.py
│   └── __init__.py
├── not_wanted_package
│   ├── other.py
│   └── __init__.py
└── setup.py

我想创建包含my_package(及其所有子包)的Python包,但不 not_wanted_package。使用python3 setup.py sdist bdist_wheel

以下setup.py正常工作:

from setuptools import setup
setup(
        name='my_package',
        version='1.0',
        packages=['my_package', 'my_package.subpackage']
)

但是当我将添加/删除/重命名任何子包时,我将不得不手动更新此文件。我可以使用setuptools提供的功能,但是find_packages()发现所有软件包(包括not_wanted_package)。另一方面,find_packages('my_package')仅发现subpackage

有什么方法可以使用find_packages()find_namespace_packages()自动发现my_package 及其子包吗?

2 个答案:

答案 0 :(得分:1)

;

}中使用关键字from setuptools import setup, find_packages setup( … packages=find_packages(include=['my_package']), … ) 时,仅包含此类软件包。未列出其他所有软件包,包括include

或者您可以使用find_packages

排除它

答案 1 :(得分:0)

find_packages支持根据documentation排除软件包。如果那还不够的话,您仍然可以简单地使用find_packages,但是根据排除的软件包的静态列表过滤输出。 setup.py是标准的Python文件,这意味着向其添加自己的代码不会有问题。

from setuptools import find_packages

def filter_packages(...):
    ...

setup(
    ...
    packages=filter_packages(find_packages("src")),
    ...
)

如果您的问题仅在于发现所有软件包,而不仅仅是子软件包,那么请查看werkzeug使用的文件结构是什么样。存储库的组织方式旨在消除find_packages的问题。如您所见,存储库中的werkzeug目录位于一个额外的src目录中,有效地使其成为src/werkzeug

https://github.com/pallets/werkzeug/blob/c6dfc4880328fe9c4558d2b2e2325761f4e17f58/setup.py#L51