[英]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.