gpt4 book ai didi

python - 如何在交互模式下将带有 matplotlib 的 Python 代码嵌入到 C 中?

转载 作者:太空宇宙 更新时间:2023-11-03 23:57:54 25 4
gpt4 key购买 nike

我想通过从 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 有一些 extra magic这样事件循环的细节就对你隐藏了。

这对我有用:

#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;
}

关于python - 如何在交互模式下将带有 matplotlib 的 Python 代码嵌入到 C 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com