Emacs Python子shell在matplotlib show()后不显示提示符

11 投票
5 回答
4120 浏览
提问于 2025-04-17 12:08

我最近在尝试使用numpy和matplotlib,结果在emacs的内部终端运行python时遇到了一些问题。

当我把py文件发送到终端解释器时,代码执行完后我可以继续输入命令,命令提示符“>>>”也正常显示。但是,当我在一个图表上调用matplotlib的显示命令时,终端就卡住了,命令提示符不再显示。

>>> plt.plot(x,u_k[1,:]);
[<matplotlib.lines.Line2D object at 0x0000000004A9A358>]
>>> plt.show();

我使用的是传统的C-python版本,在emacs 23.3上,搭配Fabian Gallina的Python python.el v. 0.23.1,操作系统是Win7。

在i-python平台上也有人提出了类似的问题:在Windows的emacs内部的py-shell中运行matplotlib或enthought.mayavi.mlab

更新:我在全新安装的Win 7 x64上也重现了这个问题,使用的是从python官网获取的标准python 2.7.2版本,以及numpy 1.6.1和matplotlib 1.1.0,emacs版本为23.3和23.4。

看来emacs的终端里可能有个bug。

5 个回答

0

我觉得这可能和show函数的行为有关:

matplotlib.pyplot.show(*args, **kw)

在ipython的pylab模式下运行时,它会显示所有图形,然后返回到ipython的提示符。

在非交互模式下,它会显示所有图形,并且会一直等待,直到这些图形被关闭;而在交互模式下,如果在切换到交互模式之前没有创建图形,它就不会有任何效果(不推荐这样做)。在这种情况下,它会显示图形,但不会阻止其他操作。

有一个实验性的关键字参数block,可以设置为True或False,以覆盖上面提到的阻止行为。

我觉得你遇到了上面提到的阻止行为,这可能导致命令行卡住。你可以试着这样运行这个函数:plt.show(block = False),看看是否能得到你期望的输出。如果这仍然有问题,告诉我,我会尝试在本地重现你的设置。

2

你可以使用不同的后端:

matplotlib.use('TkAgg')
import matplotlib.pyplot as plt 

其他图形用户界面(GUI)后端:

  • TkAgg
  • WX
  • QTAgg
  • QT4Agg

如果你在使用Elpy,可以通过 C-u C-c C-c 来运行你的代码。

4

我觉得有两种方法可以做到这一点。

  1. 使用ipython。这样你可以使用 -pylab 这个选项。我没有使用Fabian Gallina的python.el,但我想你可能需要类似这样的东西:

    (setq python-shell-interpreter-args "-pylab")
    

    请查看python.el的文档。

  2. 你可以通过 ion 手动激活交互模式。

    >>> from matplotlib import pyplot as plt
    >>> plt.ion()
    >>> plt.plot([1,2,3])
    [<matplotlib.lines.Line2D object at 0x20711d0>]
    >>>
    

撰写回答