gpt4 book ai didi

python - 在 while 循环中生成绘图后在 KeyboardInterrupt 上退出

转载 作者:可可西里 更新时间:2023-11-01 14:25:18 26 4
gpt4 key购买 nike

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

[编辑 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com