MANIFEST.in配置疑似被忽略,pip安装Python包后Certs目录及内容未纳入site-packages问题求助
我之前也踩过类似的坑,你的配置只差几个关键细节,导致Certs文件夹没被正确打包到安装包中。下面是一步步的解决方案:
1. 精准配置MANIFEST.in
你当前的recursive-include *太宽泛,且没有明确指向目标目录,容易出现匹配偏差。建议修改为更精准的路径:
recursive-include src/Package/Certs *
如果想一次性包含Package下所有子目录和文件,可以写成:
recursive-include src/Package *
这样MANIFEST.in会明确把指定目录的所有内容纳入源码包。
2. 让子目录被识别为包,或显式指定数据文件
find_packages(where='src')只会把包含__init__.py的目录识别为子包。你的Certs文件夹里没有这个文件,所以setup.py不会将它视为Package的一部分。这里有两个处理方案:
- 在
Package/Certs目录下创建一个空的__init__.py文件,让它成为合法子包,这样find_packages会自动包含它。 - 或者在setup.py中显式配置
package_data,强制包含Certs下的文件(即使它不是标准包):
setuptools.setup( # 保留原有配置 package_data={ 'Package': ['Certs/*'], }, include_package_data=True, zip_safe=False )
3. 提前验证打包结果
不要直接用pip安装测试,先执行以下命令生成源码包:
python setup.py sdist
然后打开生成的dist/myPackage-*.tar.gz压缩包,检查里面是否包含src/Package/Certs目录及对应文件。如果压缩包里有,那pip安装后site-packages里就会出现该目录;如果没有,再回头检查MANIFEST.in和setup.py的配置。
为什么之前的配置没生效?
include_package_data=True的作用是告诉setuptools:把MANIFEST.in指定的文件作为已声明包的数据文件包含进去。但如果Certs不在find_packages返回的包列表里,即使MANIFEST.in包含了它,setuptools也不会把它安装到site-packages中。这就是为什么要么给Certs加__init__.py让它成为子包,要么用package_data显式指定的核心原因。
内容的提问来源于stack exchange,提问作者WIlliam




