PyPI分发Python包时如何正确嵌入C++头文件与源文件?
解决cppyy调用C++头文件的PyPI打包问题
核心问题分析
你之前的配置把solver文件夹放到了site-packages根目录,而非eefpy包目录内,导致cppyy无法通过相对路径找到头文件。问题出在项目结构和打包配置的路径设置上。
分步解决方案
调整项目目录结构
把solver文件夹移动到eefpy包的内部,最终结构如下:your-project/ ├── setup.py ├── MANIFEST.in └── eefpy/ ├── __init__.py └── solver/ ├── eef.h └── 其他C++源文件修正setup.py配置
更新package_data,路径改为包内的solver目录:... include_package_data=True, package_data={ 'eefpy': ['solver/*.h', 'solver/*.cpp'], # 精确匹配C++文件,或用'solver/*'匹配所有 }, ...修正MANIFEST.in
确保打包时包含eefpy内部的solver文件:recursive-include eefpy/solver *动态获取头文件路径(关键)
在eefpy/__init__.py中,不要硬编码路径,而是通过pkg_resources获取包的实际安装路径,确保cppyy能正确找到文件:import cppyy import pkg_resources # 获取solver目录的绝对路径并添加到cppyy的包含路径 solver_dir = pkg_resources.resource_filename('eefpy', 'solver') cppyy.add_include_path(solver_dir) # 直接include头文件名即可 cppyy.include('eef.h')也可以直接构造头文件的绝对路径:
header_path = pkg_resources.resource_filename('eefpy', 'solver/eef.h') cppyy.include(header_path)
验证步骤
- 本地打包测试:运行
python setup.py sdist,解压生成的tar.gz文件,确认eefpy/solver目录存在。 - 虚拟环境安装测试:在虚拟环境中
pip install本地包,查看site-packages/eefpy/下是否有solver文件夹,再测试导入是否正常。
内容的提问来源于stack exchange,提问作者oriyalp
相关产品推荐
相关产品推荐

