在C++中运行带命令行参数的Python3脚本并生成matplotlib输出
无需C类型转换的C++调用Python3方案
嘿,我刚好折腾过C++调用Python3脚本的需求,尤其是还要用matplotlib生成输出的场景,给你几个完全不用纠结C类型转换(比如wchar_t**这种麻烦事)的方案,亲测好用!
方案1:用std::system直接调用命令行(最简单)
这是最省心的方式,本质上就是在C++里模拟终端执行Python脚本的命令,完全不用处理任何复杂的类型转换,和你手动在终端敲命令一模一样。
示例代码
#include <iostream> #include <string> #include <cstdlib> #include <filesystem> namespace fs = std::filesystem; int main() { // 定义脚本路径和参数 fs::path script_path = "./your_plot_script.py"; std::string plot_title = "C++ 调用生成的图表"; int data_count = 50; // 构造命令:用引号包裹含空格的路径/参数,避免解析错误 std::string cmd = "python3 \"" + script_path.string() + "\" \"" + plot_title + "\" " + std::to_string(data_count); // 执行命令 int exit_code = std::system(cmd.c_str()); if (exit_code != 0) { std::cerr << "脚本调用失败,退出码:" << exit_code << std::endl; return 1; } std::cout << "图表生成完成!" << std::endl; return 0; }
对应的Python脚本示例(your_plot_script.py)
import sys import matplotlib.pyplot as plt if __name__ == "__main__": # 从命令行获取参数 title = sys.argv[1] count = int(sys.argv[2]) # 生成图表并保存 plt.plot(range(count)) plt.title(title) plt.savefig("output_plot.png") plt.close()
这个方案的优势就是零类型转换成本,只要你的Python脚本能在终端正常运行,C++里就能直接调用。唯一需要注意的是参数里有空格时要用引号包裹,避免命令解析出错。
方案2:用pybind11实现C++与Python的无缝交互(适合复杂场景)
如果你的需求不止是简单调用脚本,还需要在C和Python之间传递复杂数据(比如数组、对象),或者要调用Python函数并获取返回值,那pybind11绝对是最佳选择——它是现代C和Python交互的神器,自动处理所有类型转换,完全不用你手动折腾wchar_t**或者Python C API的底层细节。
示例代码
#include <pybind11/embed.h> #include <iostream> #include <vector> namespace py = pybind11; int main() { try { // 初始化Python解释器(scoped_interpreter会自动管理生命周期) py::scoped_interpreter guard{}; // 导入你的Python脚本模块 py::module_ plot_module = py::module_::import("your_plot_script"); // 准备要传递给Python的数据:C++的vector和字符串 std::vector<double> data = {1.2, 3.4, 5.6, 7.8, 9.0}; std::string plot_title = "从C++传递数据生成的图表"; // 直接调用Python函数,pybind11自动完成类型转换 plot_module.attr("generate_plot_from_data")(plot_title, data); std::cout << "带自定义数据的图表生成完成!" << std::endl; } catch (const py::error_already_set& e) { // 捕获并打印Python端的错误 std::cerr << "Python执行出错:" << e.what() << std::endl; return 1; } return 0; }
对应的Python脚本示例(your_plot_script.py)
import matplotlib.pyplot as plt def generate_plot_from_data(title, data): plt.plot(data) plt.title(title) plt.savefig("custom_data_plot.png") plt.close()
这个方案的优势是类型转换完全自动化,你可以直接把C++的字符串、整数、数组、甚至自定义对象传递给Python,反之亦然,非常适合需要深度交互的场景。
关于Python版本的说明
Python3的C API和Python2确实有差异,但上面两个方案都不需要你直接接触底层API:
std::system只依赖系统的Python3命令,只要你终端里的python3指向正确版本就行;pybind11会自动适配你链接的Python3库,只要编译时指定正确的Python3路径即可。
只要你的matplotlib在Python3环境下能正常工作,C++调用后也能正常生成输出。
内容的提问来源于stack exchange,提问作者Luke Collins
相关产品推荐
相关产品推荐

