如何防止ipython在运行脚本时关闭交互模式

时间:2014-05-19 15:30:47

标签: python matplotlib ipython

此页面讨论了ipython用于交互式绘图的用法:http://matplotlib.org/users/shell.html

根据该页面,默认情况下,用于在ipython中运行脚本的%run命令会关闭交互模式。是否有以交互模式运行脚本的选项?

我希望脚本中的绘图命令一旦运行就会在绘图中生效,就好像它们是以交互方式从控制台输入一样。

例如,请考虑以下非常简单的脚本:

# try.py:
# run in ipython that is started with 
# ipython --pylab
# using 
# %run -i try.py

from numpy import *
from time import sleep

ion()
x = randn(10000)
hist(x,100)
show()
sleep(5)
xlabel('labalu')

当从评论中指示的ipython运行时,此脚本等待5秒,而不是显示所有内容。我想要的是:当注释中指示从ipython运行时,脚本应立即显示直方图,等待5秒,然后更新图形以显示x标签。

3 个答案:

答案 0 :(得分:0)

移动ion()以便在show()完成我认为你想要的之后。为什么它不在更高的位置,我不知道。

答案 1 :(得分:0)

如果wx用作后端,则以下工作:

#run in ipython that is started with ipython --pylab=wx
from numpy import *
import matplotlib
matplotlib.use('WX')
import wx
from time import sleep
import numpy as np
import matplotlib.pyplot as plt

plt.ion()
x = np.random.uniform(0,1,100)
plt.plot(x)
plt.show()
wx.Yield()
for i in reversed(range(5)):
    print(i)
    sleep(1)
plt.xlabel('labl')
wx.Yield()

因此,wx.Yield()允许与图形窗口进行交互。当脚本使用普通的python运行时,这也有效,但该图在脚本结束时自动关闭。

任何交叉后端解决方案(或qt / tk的解决方案)仍然很好。

答案 2 :(得分:0)

以下是适用于wx和qt后端的解决方案。 gcf()。canvas.flush_events()可以解决问题。

# try.py:
# run in ipython that is started with 
# ipython --pylab
# using 
# %run -i try.py

from numpy import *
import matplotlib
from time import sleep

x = randn(10000)
hist(x,100)
show()
ion()
gcf().canvas.flush_events() 
sleep(5)
xlabel('labalu')
show()