2

Pythonスクリプトが終了したときに(成功したかどうかにかかわらず)呼び出されるように、すべての正しいハンドラーなどを使用して関数を登録するにはどうすればよいですか?

私が試してみました:

@atexit.register
def finalise():
    '''
    Function handles program close
    '''
    print("Tidying up...")
    ...
    print("Closing")

...しかし、これは、たとえばユーザーがコマンドプロンプトウィンドウを閉じたときに呼び出されません(@atexit.register終了コードがゼロ以外の場合、装飾された関数は呼び出されないため)

finalise()エラーに関係なく、プログラムの終了時に呼び出されることを保証する方法を探しています。

文脈上、私の Python プログラムは、常に実行することを目的とした継続的にループするサービス プログラムです。

前もって感謝します

4

5 に答える 5

3

純粋なPythonではできないと思います。ドキュメントから:

注: このモジュールを介して登録された関数は、プログラムが Python によって処理されないシグナルによって強制終了された場合、Python の致命的な内部エラーが検出された場合、または os._exit() が呼び出された場合には呼び出されません。

これは便利だと思うかもしれません: How to capture a command prompt window close event in python

于 2012-12-18T11:30:35.640 に答える
0

メインの関数またはコードブロックであらゆる種類の例外をキャッチしようとしましたか?

于 2012-12-18T11:28:14.297 に答える
0

文脈上、私の Python プログラムは、常に実行することを目的とした継続的にループするサービス プログラムです。

これを正しく行うのは非常に困難です ( How do you create a daemon in Python? を参照してください)。代わりにhttp://pypi.python.org/pypi/python-daemon/のようなライブラリを使用する必要があります。

于 2012-12-18T11:58:52.680 に答える
0

これはうまくいくはずです

Ctrl-Cアサーションが失敗したときの両方で機能します。おそらく、同様の構成を使用して、デコレータなどとしてパックすることができます。

def main():
  print raw_input('> ')
  # do all your stuff here  

if __name__ == '__main__':
  try:
    main()
  finally:
    print 'Bye!'
于 2012-12-18T11:37:19.300 に答える
-1
atexit.register(func)

func = lambda x: x

http://docs.python.org/2/library/atexit.htmlを使用

于 2012-12-18T11:42:39.540 に答える