如何将CMakeLists.txt中的变量传递给Python脚本并访问?
传递CMake变量到Python脚本的方法
下面是几种实用的方案,帮你把CMake中定义的sourcefilelist变量传递到Python脚本中:
方案1:生成Python配置文件
通过CMake的configure_file工具,把CMake变量注入到Python模板文件中,生成可直接导入的Python配置文件。
步骤:
- 在CMakeLists.txt中添加配置逻辑:
# 将CMake列表转为Python列表格式(处理字符串转义) string(JOIN "\", \"" PY_SRC_FILES "${sourcefilelist}") set(PY_SRC_FILES_LIST "[\"${PY_SRC_FILES}\"]") # 生成Python配置文件 configure_file( ${CMAKE_SOURCE_DIR}/config_template.py.in ${CMAKE_BINARY_DIR}/generated_config.py @ONLY )
- 创建模板文件
config_template.py.in:
# 自动生成的配置文件,请勿手动修改 sourcefilelist = @PY_SRC_FILES_LIST@
- 在Python脚本中导入使用:
from generated_config import sourcefilelist # 直接使用sourcefilelist变量 for file_path in sourcefilelist: print(file_path)
方案2:通过命令行参数传递
如果只是临时调用Python脚本,直接把变量作为命令行参数传递是最直接的方式。
步骤:
- 在CMakeLists.txt中调用Python脚本时传递参数:
# 调用Python脚本并传入sourcefilelist中的所有文件 execute_process( COMMAND ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/your_script.py ${sourcefilelist} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} RESULT_VARIABLE PY_SCRIPT_EXIT_CODE )
- 在Python脚本中通过
sys.argv获取参数:
import sys # 脚本路径本身是sys.argv[0],后续元素就是传递的文件列表 sourcefilelist = sys.argv[1:] # 验证输出 print("Received files:", sourcefilelist)
方案3:生成通用配置文件(如JSON)
如果需要传递多个复杂变量,生成JSON这类通用格式的配置文件更易维护。
步骤:
- 在CMakeLists.txt中生成JSON文件:
# 初始化JSON内容 file(WRITE ${CMAKE_BINARY_DIR}/source_files.json "{\"sourcefilelist\": [") # 遍历文件列表写入JSON,转义特殊字符 foreach(file ${sourcefilelist}) string(REPLACE "\\" "\\\\" ESCAPED_FILE "${file}") file(APPEND ${CMAKE_BINARY_DIR}/source_files.json "\"${ESCAPED_FILE}\",") endforeach() # 移除最后一个逗号并补全JSON结构 file(READ ${CMAKE_BINARY_DIR}/source_files.json JSON_CONTENT) string(REGEX REPLACE ",\\]$" "]}" JSON_CONTENT "${JSON_CONTENT}") file(WRITE ${CMAKE_BINARY_DIR}/source_files.json "${JSON_CONTENT}")
- 在Python脚本中读取JSON:
import json with open('source_files.json', 'r', encoding='utf-8') as f: config_data = json.load(f) sourcefilelist = config_data['sourcefilelist']
注意事项
- 处理路径时优先使用CMake提供的绝对路径变量(如
CMAKE_CURRENT_SOURCE_DIR、CMAKE_BINARY_DIR),避免相对路径在不同环境下出错。 - 如果
sourcefilelist包含空元素或特殊字符,需要在CMake中提前做清理或转义处理。
内容的提问来源于stack exchange,提问作者Saravanan_Rk
相关产品推荐
相关产品推荐

