首页 > 解决方案 > 重复调用 PyRun_SimpleFile 时出现分段错误

问题描述

我想在 c++ 中嵌入用 3.5 版编写的 python 代码。此外,python 脚本需要作为整个脚本重复执行。我的代码如下。它在第一次迭代中执行良好,在第二次迭代中出现分段错误。

主.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;
}

例子.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

如何解决上述分段错误?

标签: c++python-3.xembedding

解决方案


查看文档

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


推荐阅读