在while循环中生成图表后,在KeyboardInterrupt上退出

我正在使用matplotlib实时监控实验,在while循环中生成图。 理想情况下,循环应该像KeyboardInterrupt一样退出。 这在Ubuntutesting中运行得很好。 在Windows 7中,使用ipython ,它会退出"Terminate batch job (Y/N)?" ipython "Terminate batch job (Y/N)?" 然后closures翻译。 我想避免这种行为,并在KeyboardInterrupt之后打开解释器。 这是一个testing脚本。

[编辑2]:如果ipython被加载为ipython --pylab这个脚本在Windows中工作正常。

 import time import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) line, = ax.plot([0], [0], 'b-o') window = 50 plot_data = np.zeros((window, 2)) i = 0 start = time.time() while True: try: data = [time.time() - start, np.random.rand()] print ' '.join('{:.2f}'.format(x) for x in data) if i < window: plot_data[i,:] = data line.set_data(plot_data[0:i+1,0], plot_data[0:i+1,1]) else: plot_data[0:window-1] = plot_data[1:window] plot_data[window-1] = data line.set_data(plot_data[:,0], plot_data[:,1]) ax.relim() ax.autoscale_view(True,True,True) fig.canvas.draw() plt.pause(0.1) i += 1 except KeyboardInterrupt: print "Program ended by user.\n" break print 'Success!' 

[编辑1]:我应该更清楚为什么我用matplotlib标记这个。 下面的示例脚本在两个操作系统中都没有问题。

 i = 0 start = time.time() while True: try: data = [time.time() - start, np.random.rand()] print ' '.join('{:.2f}'.format(x) for x in data) time.sleep(0.1) except KeyboardInterrupt: print "Proram ended by user. \n" break print 'Success!' 

所有的软件包都是昨天安装的Enthought干净安装的Enthought

现在我发现在几台Windows机器上解决这个问题的最好方法如下:

 print 'press \'q\' to end run' time.sleep(1.0) fig = plt.figure() ax = fig.add_subplot(111) line, = ax.plot([0], [0], 'b-o') window = 150 plot_data = np.zeros((window, 2)) i = 0 start = time.time() while True: data = [time.time() - start, np.random.rand()] print ' '.join('{:.2f}'.format(x) for x in data) if i < window: plot_data[i,:] = data line.set_data(plot_data[0:i+1,0], plot_data[0:i+1,1]) else: plot_data[0:window-1] = plot_data[1:window] plot_data[window-1] = data line.set_data(plot_data[:,0], plot_data[:,1]) ax.relim() ax.autoscale_view(True,True,True) fig.canvas.draw() plt.pause(delay) i += 1 if msvcrt.kbhit(): if ord(msvcrt.getch()) == 113: print "Program ended by user.\n" break print 'Success!' 

不幸的是,这并不是平台独立的,但是过去几天我读过的所有东西都让我相信平台无关的键盘输入并不是真的可以实现的。 我原来的问题中的代码在Unix和一些Windows安装中工作得很好。 这个代码在我尝试过的几个Windows安装中工作得很好。 所有这些在通过ipython --pylab运行时效果最好。 这可能现在已经足够好了。

我无法重现你的问题。 我将你的测试脚本复制到一个文件ipythonexception.py并使用run命令从ipython启动它。 然后我得到以下输出。

 In [1]: run ipythonexception.py 0.00 0.27 0.31 0.11 0.56 0.44 0.81 0.26 1.06 0.27 1.29 0.66 1.53 0.32 1.76 0.74 2.03 0.44 2.26 0.89 Program ended by user. Success! In [2]: window Out[2]: 50 In [3]: 

一切似乎都应该如此。 我在Windows 7Python 2.7.2Ipython 0.13

你用批处理文件启动Ipython吗? 我叮叮当"Terminate batch job (Y/N)?" 是我通常得到的Windows消息,如果我打破一些批处理作业。