0

プログラムが終了する前にアクションを実行する方法があれば、私はさまよっていました。私は長い間プログラムを実行していて、それを閉じてデータをテキストファイルなどに保存できるようにしたいのですが、while True実行中のループに干渉して単純に保存する方法はありませんループごとのデータは非常に効果的ではありません。

xでは、プログラムをヒットまたは破棄したときに、リストなどのデータを保存できる方法はありますか? 私は atexit モジュールを見てきましたが、プログラムを特定の時点で終了するように設定した場合を除いて、運がありませんでした。

def saveFile(list):
    print "Saving List"
    with open("file.txt", "a") as test_file:
        test_file.write(str(list[-1]))

atexit.register(saveFile(list))

それが私のコード全体atexitであり、私が言ったように、それを閉じるように設定するとうまく動作しwhile loopます.

アプリケーションが終了したときに何かを保存することは可能ですか?

4

4 に答える 4

2

アプリケーションの上部で例外をキャッチし、SystemExit再スローします。

于 2013-07-13T18:04:58.590 に答える
0

これにはいくつかのアプローチがあります。一部の人がコメントしているように、シグナル処理を使用できます...これがフォアグラウンドで実行されている端末からの[Ctrl] + [C]は、 (端末のドライバーから)プロセスにSIGHUPシグナルをディスパッチしています。

別のアプローチは、「終了」キーストロークまたはシーケンスが入力されたかどうかを確認するために、ループごとにキーボードをポーリングするように、ノンブロッキングを使用するos.read()ことです。sys.stdin.fileno

selectモジュールの機能を使用して、同様のノンブロッキング ポーリング アプローチを実装できます。termiosttyモジュールで使用されていることがわかりました。(端末設定の保存、変更の設定、および復元にこれらすべてが必要であることはエレガントではないようです。また、 and を使用osした例もいくつか見てきました。 .fcntlos.isatty(sys.stdin.fileno())

さらに別のアプローチは、cursesモジュールを使用するwindow.nodelay()window.timeout()、目的の入力動作を設定してから、またはいずれwindow.getch()window.getkey()の入力をポーリングすることです。

于 2013-07-14T04:58:20.367 に答える