在子进程中的Python解释器中运行matplotlib

问题描述 投票:0回答:1

我有一个简单的 GUI,它启动一个子进程,以交互模式启动 python 解释器,如下所示:

pyproc = subprocess.Popen([".venv\\Scripts\\python", "-i"], bufsize = 1, stdin=subprocess.PIPE,stdout=subprocess.PIPE,  stderr=subprocess.PIPE)

我在读取 stderr、stdout 和写入 stdin 时没有任何问题。我现在想在控制台中运行 matplotlib 命令,但遇到了问题。以下命令按预期运行

import matplotlib.pyplot as plt
plt.plot([1,2,1,2,1,2,1])

当我运行时,我无法显示绘图

plt.show()

Python 解释器被阻止,因为它可能期望我关闭绘图窗口。但这个窗口永远不会出现。我认为这与 python 解释器是子进程的一部分有关,但不明白到底是什么。有人可以解释一下吗?

我尝试过交互模式。在交互模式下,会显示绘图窗口,但即使我关闭绘图窗口,解释器也会被阻止。

python matplotlib subprocess
1个回答
0
投票

尝试在子进程内的 Python 解释器中运行

matplotlib
时遇到的问题是由于 GUI 工具包(例如 matplotlib 使用的工具包)与事件循环交互的方式造成的。当您调用
plt.show()
时,它会打开一个窗口并启动一个事件循环来处理 GUI 渲染和交互。

但是,这个循环会阻塞解释器,因为子进程在继续之前等待窗口关闭。在您的情况下,由于子进程是通过

stdin
stdout
控制的,因此它无法正确处理 GUI 窗口。

您可以使用

plt.ion()
启用交互模式,这使得绘图可以无阻塞地显示。

© www.soinside.com 2019 - 2024. All rights reserved.