运行脚本后保持图形"保持"状态

lll*_*lll 14 python numpy matplotlib

我有这个Python代码:

from pylab import *
from numpy import *

time=linspace(-pi,pi,10000)
ycos=cos(time)
ysin=sin(time)

plot(time,ycos)
plot(time,ysin)

show()
Run Code Online (Sandbox Code Playgroud)

如果我通过Ipython终端执行所有这些步骤,我可以保持图形打开并与之交互.但是,如果我通过$python script.py图形运行脚本打开并立即关闭.

我怎么能有与Ipython终端相同的行为但是当作为脚本运行时?

mmg*_*mgp 18

在快速查看问题之后,这是一个更明智的答案.

首先,让我们假设一下

from matplotlib import pylab
pylab.plot(range(10), range(10))
pylab.show()
Run Code Online (Sandbox Code Playgroud)

没有"坚持"情节,即在节目结束前几乎没有显示.如果发生这种情况,那么调用pylab.show()假定您正在以交互模式运行,因此在调用此函数后,还会继续执行其他一些进程.由于情况不是这样,Python退出,绘图显示也是如此.现在,解决这个问题的第一种方法是强制pylab.show执行以下操作:

pylab.show(block=True)
Run Code Online (Sandbox Code Playgroud)

尽管如此,我们还不知道为什么pylab.show假设您在交互模式下运行.要确认其假设,请尝试运行以下代码

import matplotlib
print matplotlib.is_interactive()
Run Code Online (Sandbox Code Playgroud)

如果这打印为True,则表示您的默认配置设置为interactive: True.要检查是哪种配置,请print matplotlib.matplotlib_fname()找出它的路径.打开它并检查interactive参数的值.

现在,如果您不想修改配置,我建议使用不同的解决方案:

import matplotlib
from matplotlib import pylab

if matplotlib.is_interactive():
    pylab.ioff()
pylab.plot(range(10), range(10))
pylab.show()
Run Code Online (Sandbox Code Playgroud)

因此,matplotlib在调用show方法之前,不存在认为必须渲染内容的情况.最后,这些解决方案中最可怕的是使用pylab.pause或等效:

from matplotlib import pylab
pylab.ion()  # Force interactive    
pylab.plot(range(10), range(10))
pylab.show() # This does not block
pylab.pause(2**31-1)
Run Code Online (Sandbox Code Playgroud)