6

matplotlib を使用して実験をリアルタイムで監視し、while ループでプロットを生成しています。理想的には、ループはKeyboardInterrupt. これは、Ubuntu テストでは十分に機能します。Windows 7 では、 を使用ipythonして終了し"Terminate batch job (Y/N)?"、インタープリターを閉じます。この動作を回避し、KeyboardInterrupt の後にインタープリターを開いたままにしたいと思います。ここにテストスクリプトがあります。

[EDIT 2]: このスクリプトipythonは、 としてロードされている場合、Windows で正常に動作します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 に答える