6

我正在使用 matplotlib 实时监控一个实验,以在 while 循环中生成图。理想情况下,循环应该在类似KeyboardInterrupt. 这在 Ubuntu 测试中运行良好。在 Windows 7 中,使用ipython退出,"Terminate batch job (Y/N)?"然后关闭解释器。我想避免这种行为,并在 KeyboardInterrupt 之后让解释器保持打开状态。这是一个测试脚本。

[编辑 2]:如果ipython加载为ipython --pylab.

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

4

2 回答 2

1

现在,我发现在多台 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。现在这可能已经足够好了。

于 2013-01-08T21:15:41.633 回答
0

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

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.2并且Ipython 0.13

你是从Ipython批处理文件开始的吗?如果我中断一些批处理作业,我通常会收到一条"Terminate batch job (Y/N)?"消息。Windows

于 2013-01-08T08:48:10.777 回答