簡體   English   中英

如何以交互模式將帶有matplotlib的Python代碼嵌入C中?

[英]How to embed Python code with matplotlib in interactive mode into C?

我想通過從C應用程序中嵌入對Matplotlib的調用來重用以交互模式使用的Python腳本-為了使交互模式在嵌入式Python腳本中正常工作,我需要做什么?

我使用PyRun_SimpleString()建立了一個非常簡單的示例; 它在關閉交互模式時有效,但是在交互模式處於打開狀態時,繪圖窗口僅在應用程序結束前短暫顯示

#include <Python.h>

int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }
    Py_SetProgramName(program);  /* optional but recommended */
    Py_Initialize();
    PyRun_SimpleString("from time import time,ctime,sleep\n"
                       "import matplotlib.pyplot as plt\n"
                       "import matplotlib\n"
                       "print(matplotlib.get_backend())\n"
                       "plt.ion()\n"
                       "plt.plot([1,2,3,4,3,5,7])\n"
                       "sleep(5)\n");
    Py_Finalize();
    PyMem_RawFree(program);
    return 0;
}

matplotlib使用的后端是Qt4Agg。 當我在Python解釋器中執行以上各行時,它的行為符合我的預期。 如果我將plt.ion()更改為plt.ioff()並在plt.plot()調用之后放入plt.show(),我也會看到該圖。

我假設當您說“ [w]當我在Python解釋器中執行以上代碼時,它的行為符合我的期望”,您指的是在Python命令行/ REPL中運行它。 測試嵌入式Python一對一行為的正確方法是將您放置在python腳本中,然后嘗試使用python script.py運行它。

您會注意到,在腳本內,您的代碼也遇到類似的問題。 我認為訣竅是使用plt.pause(5)而不是sleep(5) ,這將允許繪圖GUI觸發事件循環並實際正確繪制窗口( https://stackoverflow.com/a/35119003/ 11365663 )。

對於REPL,matplotlib具有一些額外的魔力,因此您可以隱藏事件循環的詳細信息。

這為我工作:

#include <Python.h>

int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }
    Py_SetProgramName(program);  /* optional but recommended */
    Py_Initialize();
    PyRun_SimpleString("from time import time,ctime,sleep\n"
                       "import matplotlib.pyplot as plt\n"
                       "import matplotlib\n"
                       "print(matplotlib.get_backend())\n"
                       "plt.ion()\n"
                       "plt.plot([1,2,3,4,3,5,7])\n"
                       "plt.pause(5)\n");
    Py_Finalize();
    PyMem_RawFree(program);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM