第二次运行Python脚本后的SIGSEGV

时间:2018-12-16 14:36:10

标签: python-3.x qt sigsegv

如果要在Qt应用程序中按下按钮,我想使用matplotlib和python脚本绘制一些数据。通过以下方式定义从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进程在尝试调用PyRun_SimpleFile时会收到SIGSEGV。

任何错误可能出在哪里的想法?


因此,第二次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 :(得分:1)

fopen使用不正确。失败时返回NULL。您需要将测试if(file<0)替换为if(file==NULL)。就目前而言,您错过了失败案例。

如果此类操作失败,建议向用户提供反馈。

This answer(可能还有很多)展示了如何获取有关fopen错误的更多详细信息。