我正在使用matplotlib实时监视实验,以在while循环中生成图。理想情况下,循环应在类似于KeyboardInterrupt的地方退出。这在Ubuntu测试中效果很好。在Windows 7中,使用ipython,它以"Terminate batch job (Y/N)?"退出,然后关闭解释器。我想避免这种现象,并在KeyboardInterrupt之后使解释器保持打开状态。这是一个测试脚本。

[EDIT 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全新安装的一部分安装的。

最佳答案

现在,我发现在多台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运行时,所有这些方法效果最佳。目前可能已经足够好了。

关于python - 在while循环中生成图形后在KeyboardInterrupt上退出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14200020/

10-16 20:50