pybind11项目中C++与setup.py共享宏/变量的实现方法
在pybind11项目中让C++头文件与setup.py共用宏/变量的实现方案
这个需求完全可行,下面提供几种实用的实现方式:
方法一:解析C++头文件提取宏
直接在setup.py中编写代码读取C++头文件,提取#define定义的宏,无需额外配置文件。
示例代码(setup.py中添加):
def parse_cpp_defines(header_path): defines = {} with open(header_path, 'r', encoding='utf-8') as f: for line in f: stripped_line = line.strip() if stripped_line.startswith('#define'): parts = stripped_line.split(maxsplit=2) if len(parts) >= 2: macro_name = parts[1] # 处理无值的宏(如#define THIS_NAME)和有值的宏 macro_value = parts[2] if len(parts) == 3 else None defines[macro_name] = macro_value return defines # 读取defined.h中的宏 cpp_defines = parse_cpp_defines('defined.h') THIS_NAME = cpp_defines.get('THIS_NAME') THIS_NAME1 = cpp_defines.get('THIS_NAME1') # 后续即可正常使用这些变量 if THIS_NAME1 == 'this_name': # 执行你的逻辑 pass
C++端保持原有defined.h不变,正常引用即可。
方法二:用Python配置文件生成C++头文件
把共用变量统一放在Python配置文件中,通过脚本生成C头文件,这种方式避免解析C语法的潜在问题,更适合复杂场景。
- 创建
config.py存储共用变量:
# config.py THIS_NAME = "my_project" THIS_NAME1 = "this_name"
- 编写生成头文件的脚本
generate_header.py:
from config import * with open('defined.h', 'w', encoding='utf-8') as f: # 生成C++宏定义 f.write(f"#define THIS_NAME {THIS_NAME}\n") f.write(f"#define THIS_NAME1 {THIS_NAME1}\n") # 如果有其他宏,继续添加
- 在setup.py中先执行生成脚本,再导入变量:
import subprocess import sys from setuptools import setup, Extension from config import THIS_NAME, THIS_NAME1 # 先生成C++头文件 subprocess.run([sys.executable, 'generate_header.py'], check=True) # 后续逻辑正常使用变量 if THIS_NAME1 == 'this_name': # 执行你的逻辑 pass # 剩余的setup配置...
C++端直接引用生成的defined.h即可,所有变量和Python端保持一致。
方法三:使用纯文本配置文件
创建一个双方都能解析的纯文本配置文件(如config.cfg),分别在C++和Python中读取。
示例config.cfg:
THIS_NAME = my_project THIS_NAME1 = this_name
Python端用configparser读取:
import configparser config = configparser.ConfigParser() config.read('config.cfg') THIS_NAME = config.get('DEFAULT', 'THIS_NAME') THIS_NAME1 = config.get('DEFAULT', 'THIS_NAME1')
C++端可以通过文件读取逻辑解析该配置文件,或者写一个小工具生成头文件,原理和方法二类似。
内容的提问来源于stack exchange,提问作者xycs
相关产品推荐
相关产品推荐

