Override ipython exit function - or add hooks in to it

瘦欲@ 提交于 2019-12-19 21:26:51

问题


In my project manage, I am embedding iPython with:

from IPython import start_ipython
from traitlets.config import Config
c = Config()
c.TerminalInteractiveShell.banner2 = "Welcome to my shell"
c.InteractiveShellApp.extensions = ['autoreload']
c.InteractiveShellApp.exec_lines = ['%autoreload 2']
start_ipython(argv=[], user_ns={}, config=c)

It works well and opens my iPython console, but to leave ipython I can just type exit or exit() or press ctrl+D.

What I want to do is to add an exit hook or replace that exit command with something else.

Lets say I have a function.

def teardown_my_shell():
    # things I want to happen when iPython exits

How do I register that function to be executed when I exit or even how to make exit to execute that function?

NOTE: I tried to pass user_ns={'exit': teardown_my_shell} and doesn't work.

Thanks.


回答1:


First thanks to @user2357112, I learned how to create an extension and register a hook, but I figured out that shutdown_hookis deprecated.

The right way is simply.

import atexit

def teardown_my_shell():
    # things I want to happen when iPython exits

atexit.register(teardown_my_shell)



回答2:


Googling IPython exit hook turns up IPython.core.hooks. From that documentation, it looks like you can define an exit hook in an IPython extension and register it with the IPython instance's set_hook method:

# whateveryoucallyourextension.py

import IPython.core.error

def shutdown_hook(ipython):
    do_whatever()
    raise IPython.core.error.TryNext

def load_ipython_extension(ipython)
    ipython.set_hook('shutdown_hook', shutdown_hook)

You'll have to add the extension to your c.InteractiveShellApp.extensions.



来源:https://stackoverflow.com/questions/39499748/override-ipython-exit-function-or-add-hooks-in-to-it

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!