Python setuptools的find_namespace_packages的exclude参数排除子包不生效问题
解决方案
步骤1:修正exclude匹配规则
find_namespace_packages的单条规则xxx.b.internal_b仅会排除该包本身,不会匹配它的所有子级子包/模块,需要补充通配符规则覆盖子级内容:
from setuptools import setup, find_namespace_packages # 可选:调试打印确认最终打包的包列表 packages = find_namespace_packages( where="pysrc", include=["xxx.*"], exclude=["xxx.b.internal_b", "xxx.b.internal_b.*"] ) print("待打包包列表:", packages) setup( name="xxx", package_dir={"": "pysrc"}, packages=packages, setup_requires=["setuptools", "setuptools-git", "wheel"] )
步骤2:清理本地构建缓存再打包
本地残留的build、dist、*.egg-info目录会导致新配置不生效,打包前先执行清理命令:
rm -rf build dist *.egg-info python setup.py bdist_wheel
兜底方案:手动过滤包列表
如果上述规则仍不生效,可以直接对返回的包列表做前缀过滤,确保完全匹配排除规则:
from setuptools import setup, find_namespace_packages all_packages = find_namespace_packages(where="pysrc", include=["xxx.*"]) # 过滤所有以xxx.b.internal_b开头的包 filtered_packages = [pkg for pkg in all_packages if not pkg.startswith("xxx.b.internal_b")] setup( name="xxx", package_dir={"": "pysrc"}, packages=filtered_packages, setup_requires=["setuptools", "setuptools-git", "wheel"] )
额外说明
如果需要排除xxx.b.internal_b下的非py资源文件,可在setup参数中补充exclude_package_data配置:
setup( # 其余配置保持不变 exclude_package_data={ "xxx.b": ["internal_b/*", "internal_b/**/*"] } )
内容的提问来源于stack exchange,提问作者lnshi
相关产品推荐
相关产品推荐

