我想在C ++中嵌入一个用3.5版编写的python代码。另外,python脚本需要作为整个脚本重复执行。我的代码如下。它在第一次迭代中执行得很好,而在第二次迭代中给出了分割错误。
main.cpp:
#include <Python.h>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i = 0;
while(i<3){
cout<<"start"<<endl;
Py_Initialize();
FILE* file;
wchar_t* _argv[argc];
for(int i=0; i<argc; i++){
wchar_t *arg = Py_DecodeLocale(argv[i], NULL);
_argv[i] = arg;
}
PySys_SetArgv(argc, _argv);
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyUnicode_FromString("."));
file = fopen("./example.py","r");
PyRun_SimpleFile(file, "./example.py");
fclose(file);
Py_Finalize();
cout<<"Done"<<endl;
i++;
}
return 0;
}
example.py:
import tensorflow as tf
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'initial learning rate')
def main(argv=None):
print(FLAGS.learning_rate)
if __name__ == '__main__':
main()
我使用以下命令构建项目:
cmake --build . --target Demo -- -j 2
并执行为:
./Demo --learning_rate 0.02
输出为:
start
0.02
Done
start
Segmentation fault (core dumped)
然后,我将“ example.py”的内容替换为:
print("Hi")
输出为:
start
Hi
Done
start
Hi
Done
start
Hi
Done
如何解决上述细分错误?
答案 0 :(得分:1)
请参见docs
如果某些扩展名的初始化例程被多次调用,它们可能无法正常工作;如果应用程序多次调用Py_Initialize()和Py_Finalize(),则会发生这种情况。