如何打包含C/C++源码的Python模块并实现安装时编译?
解决方案
要实现用户安装时编译C/C++源码的需求,核心是避免发布预编译的二进制wheel包,转而发布源码包,同时依托setuptools的标准扩展模块编译流程处理安装时的编译工作,具体步骤如下:
保留ext_modules的标准配置
你当前的ext_modules配置是正确的,setuptools会在用户安装源码包时自动编译指定的C/C++文件:ext_modules=[ Extension( 'mymodule', ['library.cpp'], ), ],只构建并发布源码包(sdist)
不要生成二进制wheel包,因为它会包含本地编译的产物。构建源码包的命令:python setup.py sdist执行后会在
dist目录下生成类似mymodule-x.y.z.tar.gz的源码压缩包。上传源码包到PyPi
使用twine等工具上传时,只上传生成的源码包,不要上传wheel文件:twine upload dist/mymodule-*.tar.gz说明编译环境要求
在项目的README或文档中明确告知用户,安装前需要具备编译环境:- Linux:安装
gcc、g++、python3-dev(或对应Python版本的开发包) - macOS:安装Xcode Command Line Tools
- Windows:安装Visual Studio Build Tools并选择对应Python版本的编译工具链
- Linux:安装
这样,当用户执行pip install mymodule时,pip会下载源码包,自动调用setuptools编译C/C++源码,生成适合用户本地环境的扩展模块并完成安装,完全符合你“不在本地预编译,让用户安装时编译”的需求。
之前尝试的自定义cmdclass方案无效,是因为pip安装二进制wheel时会跳过自定义的编译步骤,而标准的ext_modules流程是setuptools内置的,能在源码包安装时自动触发编译,无需额外自定义命令。
内容的提问来源于stack exchange,提问作者Ketu
相关产品推荐
相关产品推荐

