SIGSEGV после запуска скрипта Python во второй раз - PullRequest
0 голосов
/ 16 декабря 2018

Я хочу построить некоторые данные, используя matplotlib и скрипт на python, если нажата кнопка в приложении Qt.Слот, который получает сигнал от startPythonButton, определяется следующим образом:

void MainWindow::on_wdgt_startPython_clicked()
{
    FILE* file;
    Py_Initialize();
    file=fopen("/home/user/test.py","r");
    if(file<0){
        Py_Finalize();
        return;
    }
    PyRun_SimpleFile(file,"/home/user/test.py");
    Py_Finalize();
    fclose(file);
}

Сценарий python определяется как:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0,2*np.pi,100)
y=np.sin(x)

plt.plot(x,y)
plt.show()

Когда я запускаю программу Qt и нажимаюstartPythonButton, сюжет отображается нормально.Когда я закрываю окно графика и снова нажимаю startPythonButton, процесс Qt получает SIGSEGV при попытке вызвать PyRun_SimpleFile.

Любые идеи, где может быть ошибка?


Получается, что второй вызов fopen () не завершается ошибкой (например, не возвращает NULL):

void MainWindow::on_wdgt_startPython_clicked()
{
    FILE* file;
    Py_Initialize();
    file=fopen("/home/user/test.py","r");
    if(file==NULL){
        std::stderr << "Failed to open file." << std::endl;
        Py_Finalize();
        return;
    }
    PyRun_SimpleFile(file,"/home/user/test.py");
    Py_Finalize();
    if(fclose(file)!=0){
        std::stderr << "Failed to close file." << std::endl;
        return;
    };
}

1 Ответ

0 голосов
/ 17 декабря 2018

fopen используется неправильно.Возвращает NULL при неудаче.Вам нужно заменить тест if(file<0) на if(file==NULL).В его нынешнем виде вы пропускаете случай сбоя.

Желательно предоставить обратную связь с пользователем в случае сбоя такой операции.

Этот ответ (возможно, среди многих других)показывает, как получить более подробную информацию об ошибках fopen.

...