2016-10-06 14 views
1

cursesモジュールを使用する無限ループでPythonプログラムをすばやく終了するには、どのような方法が最適ですか?Python Curses:プログラムの高速終了

私はループの最後でこれと結合NODELAY()メソッドを追加しようとしました

if screen.getch() == ord('q'): 
    break 

しかし、それはループの1回の繰り返しのすべての関数呼び出しを行うために2〜3秒かかります。また、アプリケーションのために、5秒ごとよりも頻繁にループを実行するのは理にかなっていません。これは、プログラムを終了させる私のやり方が働くために、「q」を2〜8秒間押さなければならないことがあることを意味します。

私のコードは次のようになります。

loop = 1 
while loop: 

    #Loop code 

if screen.getch() == ord('q'): 
    loop = -1 

この方法では、押して終了するには「Q」を保持する必要がない。

import curses 
import time 

def main(screen): 
    refresh_rate = 5 
    screen.nodelay(1) 

    # Infinite loop. Displays information and updates it 
    # every (refresh_rate) # of seconds 

    while True: 

     # Makes several http requests 
     # and passes responses through multiple functions 

     # Escape infinite loop 
     if screen.getch() == ord('q'): 
      break 

     # Wait before going through the loop again 
     time.sleep(refresh_rate) 

if __name__ == "__main__": 
    curses.wrapper(main) 

私の他のソリューションが持つ真の間、交換しましたプログラム。しかし、 'q'を一度押して終了するまでには最大8秒かかることがあります。

明らかな理由から、これはプログラムを終了する最良の方法ではないようです。私はかなり良い(より速い)解決策があるはずだと確信しています。

それ以外は、プログラムは正常に動作します。 2行に300行以上のファイルがあるので、コードの関連部分だけを試した解決策で投稿しています。

答えて

1

nodelayがあるとすれば、napmsを小さな(20-50ミリ秒)時間で使用し、5秒間の目標に対処し、数回(10-25)繰り返した後に関数を実行することですgetch/napmsループ。

2つのスイッチを切り替えるときに物事を洗い流さない限り、cursesと標準I/Oの混合はうまくいきません。

+0

これはまさに私が探していたものです!getch/napmsループからの破損が明らかにメインループから壊れることはないので、ループを別の関数の中に置かなければなりませんでした。そこで、getch/napmsループ内の 'break'を' return'に置き換えました。ありがとうございました。 –

0

あなたの'q'getch()sleepコールの間に入っている可能性があります。 getch()が実行に1秒以上かかり、sleepがプログラムを5秒間ロックすると、待つ予定のキーを押すたびにいつもそうなるでしょう。

try: 
while True: 
    do_something() 
except KeyboardInterrupt: 
    pass 

は確かに、これはユーザー向けのアプリケーションであることを意味するならば、ということ:それは同じように扱うことができKeyBoardInterrupt例外を生成します -

任意のPythonスクリプトを終了する最も簡単な方法は、Ctrl-Cを押すことです十分ではないかもしれない。しかし、プロダクションアプリケーションが完全なイベントループやそれらを終了させるUIなしで動作することはありそうもありません。あなたはすでにやっているやって別の方法をしたい場合

最後に、あなたが使用することができます。

import sys 
sys.stdin.read(1) 

を一度にユーザー入力の1つのBYEを読むに。もし私があなただったら私はCtrl-Cルートに行きます。

+0

私は、このアプリケーションでは 'Ctrl-C'を使用しないことをお勧めします。しかし、 'KeyBoardInterrupt'の扱い方を教えてくれてありがとう。ちょうどの場合に私のコードに追加しました。 –

関連する問題