2016-10-21 10 views
2

pythonには、インタープリタを閉じる前に実行する関数を登録するatexitモジュールがあります。 This questionなぜatexitが呼び出されないのかipxthonの代わりにatexit

%run <name>で実行されたものを終了する前に、ipythonの代わりに機能を登録する方法があるのでしょうか?理想的には、インタープリタによって のいずれかのモジュールに登録機能を持つデコレータを作成したいと考えています。

+1

あり、具体的%のrun' '後に発火する何かがありませんが、いずれかの[カスタム魔法を定義]ができ(http://ipython.readthedocs.io/:それ以外の場合は、コードのこの作品は、他の誰かに利益をもたらすかもしれません実行するために '%run'と何らかのアクションを実行するか、または[post_run_cellコールバックを提供する](http://ipython.readthedocs.io/en/stable/config/callbacks.html)を実行するには、en/stable/config/custommagics.html各入力が実行された後。 –

答えて

2

おかげでトーマスKさんに感謝します。彼が答えを書く場合、私は彼を受け入れます。

# exit_register runs at the end of ipython %run or the end of the python interpreter 
try: 
    def exit_register(fun, *args, **kwargs): 
     """ Decorator that registers at post_execute. After its execution it 
     unregisters itself for subsequent runs. """ 
     def callback(): 
      fun() 
      ip.events.unregister('post_execute', callback) 
     ip.events.register('post_execute', callback) 


    ip = get_ipython() 
except NameError: 
    from atexit import register as exit_register 


@exit_register 
def callback(): 
    print('I\'m done!') 


print('Running') 
+1

これは素晴らしいです。追加する1つのこと。 'atexit.register'は引数とキーワード引数を取ることができます。 'exit exit_register(fun、* args、** kwargs)'と 'fun(* args、** kwargs)'を介してこれを許可するために 'exit_register'を変更することを検討してください。 – JesterEE

+0

@JesterEE。それに言及してくれてありがとう。一定 –