2

以下は、test_atexit.py というスクリプトで記述されたコードです。

def exit_function():
    print "I am in exit function"
import atexit
atexit.register(exit_function)
print "I am in main function"

python2.4 を使用して関数を実行すると、exit_function が呼び出されます

$python2.4 test_atexit.py  
I am in main function  
I am in exit function

ipython を使用して同じものを実行すると、exit_function が呼び出されません

$ ipython  
In [1]: %run test_atexit.py  
I am in main function  
In [2]: 

Ipythonを使用してスクリプトを実行するときにexit_functionが呼び出されない理由と、ipythonでexit_functionを呼び出す方法

4

1 に答える 1

3

atexit関数は、スクリプトが終了したときではなく、Python インタープリターが終了したときに呼び出されます。IPython で何かを実行%runすると、IPython を終了するまでインタープリターは引き続き実行されます。これを行うと、からの出力が表示されるはずですexit_function()

おそらく、必要なのは try/finally です。これにより、例外が発生した場合でも、try ブロックの後に finally コードが実行されることが保証されます。

try:
    print("Doing things...")
    raise Exception("Something went wrong!")
finally:
    print("But this will still happen.")

本当に atexit 関数を実行する必要がある場合は、 を呼び出すことができますatexit._run_exitfuncs。ただし、これは文書化されておらず、何かが atexit 関数を登録できるため、予期しないことを行う可能性があります。

(また、Python 2.4? 世界中の開発者の正気を保つために、アップグレードできる場合はアップグレードしてください ;-) )

于 2014-02-07T17:39:00.040 に答える