Emacs Python子shell在matplotlib show()后不显示提示符
我最近在尝试使用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 个回答
我觉得这可能和show函数的行为有关:
matplotlib.pyplot.show(*args, **kw)
在ipython的pylab模式下运行时,它会显示所有图形,然后返回到ipython的提示符。
在非交互模式下,它会显示所有图形,并且会一直等待,直到这些图形被关闭;而在交互模式下,如果在切换到交互模式之前没有创建图形,它就不会有任何效果(不推荐这样做)。在这种情况下,它会显示图形,但不会阻止其他操作。
有一个实验性的关键字参数block,可以设置为True或False,以覆盖上面提到的阻止行为。
我觉得你遇到了上面提到的阻止行为,这可能导致命令行卡住。你可以试着这样运行这个函数:plt.show(block = False)
,看看是否能得到你期望的输出。如果这仍然有问题,告诉我,我会尝试在本地重现你的设置。
你可以使用不同的后端:
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
其他图形用户界面(GUI)后端:
TkAgg
WX
QTAgg
QT4Agg
如果你在使用Elpy,可以通过 C-u C-c C-c
来运行你的代码。
我觉得有两种方法可以做到这一点。
使用ipython。这样你可以使用
-pylab
这个选项。我没有使用Fabian Gallina的python.el,但我想你可能需要类似这样的东西:(setq python-shell-interpreter-args "-pylab")
请查看python.el的文档。
你可以通过 ion 手动激活交互模式。
>>> from matplotlib import pyplot as plt >>> plt.ion() >>> plt.plot([1,2,3]) [<matplotlib.lines.Line2D object at 0x20711d0>] >>>