gpt4 book ai didi

python - 如何在 macOS 上使用非阻塞 matplotlib(如 IPython 的 %matplotlib)构建 Python REPL

转载 作者:行者123 更新时间:2023-12-05 05:21:49 27 4
gpt4 key购买 nike

我正在 macOS 中编写终端 REPL,并且很难复制使用 IPython 的 %matplotlib 魔法获得的非阻塞 matplotlib 绘图行为。

考虑以下简单的 REPL(我在 macOS 10.12 上使用来自 Anaconda 的 Python 3.5):

#!/usr/bin/env pythonw

# Basic REPL (note: doesn't show output)

_globals = _locals = globals().copy()

while True:
command = input(">>> ")
res = exec(command, _globals, _locals)

pythonw 是让绘图正确聚焦所必需的。

如果你在这个shell中运行

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

它会阻塞。我试过了

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

这不会阻塞,但出现的绘图窗口完全没有响应。我什至无法关闭它。运行

import matplotlib.pyplot as plt
plt.plot([1, 2])
plt.show(block=False)

是一样的。

另一方面,如果你跑

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

在 IPython 5.1.0 中,它可以完美运行。 REPL 不阻塞,我可以和剧情互动。

我已经尝试阅读 IPython 源代码来找出我需要复制的内容,但我无法弄清楚。我什至试过运行 IPython.core.pylabtools.activate_matplotlib("MacOSX"),但它不起作用。

最佳答案

我发现 IPython 4.2.1 实际上做错了,这让我可以将 IPython 代码库一分为二并找到答案。

使用 prompt-toolkit 的 IPython 5 有一个特殊的 inputhook,它传递给 run_application 的 prompt-toolkit 的 eventloop 参数。 IPython 的 inputhook 在 IPython.terminal.pt_inputhooks.osx 中定义.该代码对 macOS API 进行了一系列 ctypes 调用(基本上是为了获取 GUI 事件循环)。

根据我的问题,我不知道如何将它用于虚拟 REPL,但我实际上使用的是 prompt-toolkit,所以这对我来说很好。要使用它,请使用

from IPython.terminal.pt_inputhooks.osx import inputhook
from prompt_toolkit.shortcuts import create_eventloop

# <prompt-toolkit stuff>
...
run_application(eventloop=create_eventloop(inputhook)

在导入 matplotlib.pyplot 之前,您仍然需要调用 matplotlib.interactive(True) 以使绘图自动显示(否则您必须调用 plt.show() 一直,更重要的是,情节会阻塞)。

关于python - 如何在 macOS 上使用非阻塞 matplotlib(如 IPython 的 %matplotlib)构建 Python REPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42019739/

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