You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyPI分发Python包时如何正确嵌入C++头文件与源文件?

解决cppyy调用C++头文件的PyPI打包问题

核心问题分析

你之前的配置把solver文件夹放到了site-packages根目录,而非eefpy包目录内,导致cppyy无法通过相对路径找到头文件。问题出在项目结构和打包配置的路径设置上。

分步解决方案

  1. 调整项目目录结构
    把solver文件夹移动到eefpy包的内部,最终结构如下:

    your-project/
    ├── setup.py
    ├── MANIFEST.in
    └── eefpy/
        ├── __init__.py
        └── solver/
            ├── eef.h
            └── 其他C++源文件
    
  2. 修正setup.py配置
    更新package_data,路径改为包内的solver目录:

    ...
    include_package_data=True,
    package_data={
        'eefpy': ['solver/*.h', 'solver/*.cpp'],  # 精确匹配C++文件,或用'solver/*'匹配所有
    },
    ...
    
  3. 修正MANIFEST.in
    确保打包时包含eefpy内部的solver文件:

    recursive-include eefpy/solver *
    
  4. 动态获取头文件路径(关键)
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:03