c++程序:
#include "cmdline.h"
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cmdline::parser a;
a.add<string>("name", 'h', "name to file", true);
a.add<string>("outpath", '\0', "path for output", true);
a.parse_check(argc, argv);
std::ostringstream outPutPathBuffer;
outPutPathBuffer << a.get<std::string>("outpath");
std::string outPutPath = outPutPathBuffer.str();
string name = a.get<string>("name");
ofstream outfile;
outfile.open(outPutPath);
outfile << name << endl;
return 0;
}
python调用的程序:
import subprocess
filepath = r'H:\cmake_test\build\CMakeProject1\CMakeProject1'
subprocess.run(filepath)
整个程序的思路是,python 命令行传入参数 name,输出文件的地址等 c++接收参数后快速运算,将结果写入规定的地址里
首先,对于C++程序而言,需要有一个接收命令行的 parser ,因此需要用到头文件 cmdline.h 如何使用该标准库可以参考我之前的一些文章 parser 接收到参数后将其写入文件,C++程序结束,返回代码 0 python 程序接收代码后正常结束
其中的难点是C++程序调用了一些库,杂七杂八,导致编译完,python不能调用 解决方案:在编译时加入 -static 参数即可。 参见1 2 3 动态库和静态库的区别4 cmake 实现动态库和静态库5
下面附上debug的艰辛历程: 最开始以为是 release 和 debug 模式导致的问题…
我用了cmake,尝试了release版本和默认的debug版本,先是编译了官方自带的案例(有头文件)
使用Python调两个生成文件,均可正常输出。之后使用cmake编译了release版本,放到同学电脑上跑了一下还是报错
怀疑不是这个debug release的问题
使用subprocess库,使用ret接收run的结果
在Python的debug模式下发现run是completed,但是return code 是3221225785
搜索这个代码,发现解决办法是在编译过程中加一个参数 -static
加上,使用gcc编译,Python可以正常调用。使用cmake编译,默认debug版本和release均可调用
|