重复调用PyRun_SimpleFile时发生分段错误

时间:2019-06-17 13:45:58

标签: c++ python-3.x embedding

我想在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

如何解决上述细分错误?

1 个答案:

答案 0 :(得分:1)

请参见docs

  

如果某些扩展名的初始化例程被多次调用,它们可能无法正常工作;如果应用程序多次调用Py_Initialize()和Py_Finalize(),则会发生这种情况。