Cython打包问题:如何使安装后的Python包同时包含.pxd、.pyx与编译生成的.so文件
Cython打包问题:如何使安装后的Python包同时包含.pxd、.pyx与编译生成的.so文件
看起来你已经走完了大部分流程,核心问题其实是分发包没有包含你的.pxd和.pyx源文件,导致pip install .后只有编译好的.so。我来帮你一步步解决:
第一步:补全MANIFEST.in配置
你项目里已经有MANIFEST.in,但大概率没正确配置包含Cython源文件。这个文件控制着生成源码分发包(sdist)时要包含哪些非Python默认文件,直接在里面加上:
recursive-include test_package *.pxd recursive-include test_package *.pyx
这样生成的sdist包就会把所有子目录下的.pxd和.pyx都打包进去,pip安装时才会把它们复制到site-packages的包目录里。
第二步:确认setup.py的配置正确性
你当前的package_data和include_package_data=True配置是对的,但可以再明确一点(避免路径匹配问题):
package_data={ "test_package": ["**/*.pxd", "**/*.pyx"] }, include_package_data=True,
这个配置会告诉setuptools,安装时要把package_data里指定的文件和MANIFEST.in里包含的文件一起复制到目标目录。
第三步:验证分发包内容
先手动生成源码包看看是否包含了所需文件,执行:
python setup.py sdist
然后去dist目录解压生成的test_package-1.0.0.tar.gz,检查里面的test_package目录下是否有所有的.pxd和.pyx文件。如果有,说明配置没问题了。
第四步:测试安装
现在再执行pip install .,安装完成后去你的Python环境的site-packages/test_package目录下看看,应该同时存在:
- 编译好的
.so文件(比如mappings.cpython-310-x86_64-linux-gnu.so) - 原始的
.pxd和.pyx文件
解释你之前的测试现象
pip install -e .是开发模式,它直接把本地源码目录链接到Python环境,所以源文件都在原地,.so也是在本地编译生成的,因此egg-info/SOURCES.txt会包含源文件,但不会包含.so(因为开发模式不复制so到site-packages)。- 之前
pip install .后只有.so,是因为生成的sdist包没包含.pxd和.pyx,所以安装时只有编译后的文件被复制进去。
另外,如果你用wheel包分发,也要确保wheel包含这些源文件,不过只要MANIFEST.in和package_data配置正确,setuptools会自动处理。
备注:内容来源于stack exchange,提问作者Vera
相关产品推荐
相关产品推荐

