You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MANIFEST.in配置疑似被忽略,pip安装Python包后Certs目录及内容未纳入site-packages问题求助

解决Python包安装时Certs目录未被包含的问题

我之前也踩过类似的坑,你的配置只差几个关键细节,导致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

火山引擎 最新活动