Ошибка сегментации возникает, когда PyRun_SimpleFile вызывается повторно - PullRequest
1 голос
/ 17 июня 2019

Я хочу встроить код Python, написанный в версии 3.5 на C ++. Кроме того, сценарий 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 Ответ

1 голос
/ 17 июня 2019

См. документы

Некоторые расширения могут работать неправильно, если их процедура инициализации вызывается более одного раза;это может произойти, если приложение вызывает Py_Initialize () и Py_Finalize () более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...