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

在setup.py中自动发现Python子包,python,setuptools,setup.py,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(及其所有子包)但不包含not_-wanted\u

我有以下项目结构:

project_dir
├── my_package
│   ├── subpackage
│   │   ├── bar.py
│   │   └── __init__.py
│   ├── foo.py
│   └── __init__.py
├── not_wanted_package
│   ├── other.py
│   └── __init__.py
└── setup.py
我想创建包含
my_-package
(及其所有子包)但不包含
not_-wanted\u-package
的Python包。使用
python3 setup.py sdist bdist\u wheel

以下
setup.py
工作正常:

from setuptools import setup
setup(
        name='my_package',
        version='1.0',
        packages=['my_package', 'my_package.subpackage']
)
但当我添加/删除/重命名任何子包时,我必须手动更新此文件。我可以使用
setuptools
提供的功能,但
find_packages()
会发现所有包(包括
不需要的_package
)。另一方面,
查找包(“我的包”)
只查找
子包


是否有任何方法可以使用
find_packages()
find_namespace_packages()
自动发现
my_packages
及其子包?

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

from setuptools import find_packages

def filter_packages(...):
    ...

setup(
    ...
    packages=filter_packages(find_packages("src")),
    ...
)
如果您的问题仅仅在于发现所有包而不是子包,那么请查看
werkzeug
使用的文件结构。存储库的组织方式旨在消除
查找包的问题。如您所见,存储库中的
werkzeug
目录被放置在一个额外的
src
目录中,有效地使其成为
src/werkzeug

当在
find_packages
中使用关键字
include
时,仅包括此类包。不列出包括
不需要的包在内的所有其他包

或者,您可以使用
exclude=[“不需要包”]

from setuptools import setup, find_packages

setup(
    …
    packages=find_packages(include=['my_package']),
    …
)