17

关于这个有几个主题,但没有一个令人满意的答案。

我有一个在 IPython qt 控制台中运行的 python 应用程序

http://ipython.org/ipython-doc/dev/interactive/qtconsole.html

当我遇到错误时,我希望能够在那时与代码进行交互。

    try: 
      raise Exception()
    except Exception as e:
        try: # use exception trick to pick up the current frame
            raise None
        except:
            frame = sys.exc_info()[2].tb_frame.f_back
        namespace = frame.f_globals.copy()
        namespace.update(frame.f_locals)
        import IPython
        IPython.embed_kernel(local_ns=namespace)  

我认为这会起作用,但我收到一个错误:

RuntimeError:线程只能启动一次

4

2 回答 2

66

我只是用这个:

from IPython import embed; embed()

对我来说比其他任何东西都好:)


更新:

为了庆祝这个答案获得 50 票赞成,以下是我在此片段发布后的六年中对其所做的更新。

首先,我现在喜欢在单个语句中导入和执行,因为这些天我对所有 python 代码都使用黑色,并且它以在这种特定和不寻常的上下文中没有意义的方式重新格式化原始代码段。所以:

 __import__("IPython").embed()

考虑到我经常在循环或线程中使用它,包含一个允许终止父进程的片段会很有帮助(部分是为了方便,部分是为了提醒自己最好的方法)。 os._exit是这里的最佳选择,所以我的片段包括这个(使用单个语句的相同逻辑):

q = __import__("functools").partial(__import__("os")._exit, 0)

然后我可以简单地使用q()if/when 我想退出主进程。

我的完整片段(# FIXME以防我可能忘记删除它!)看起来像这样:

q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  
于 2014-02-02T07:17:24.630 回答
5

您可以按照以下方法将 IPython 会话嵌入到您的程序中:

try:
    get_ipython
except NameError:
    banner=exit_msg=''
else:
    banner = '*** Nested interpreter ***'
    exit_msg = '*** Back in main IPython ***'

# First import the embed function
from IPython.frontend.terminal.embed import InteractiveShellEmbed
# Now create the IPython shell instance. Put ipshell() anywhere in your code
# where you want it to open.
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)

然后ipshell()在您想要放入 IPython shell 时使用。这将允许您在代码中嵌入(甚至嵌套)IPython 解释器并检查对象或程序的状态。

于 2013-03-27T17:20:42.313 回答