如何将IPython解释器嵌入到在IPython Qt控制台中运行的应用程序中

24

有一些关于这个话题的讨论,但没有一个令人满意的答案。

我有一个在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)  

我认为这个代码应该可以运行,但是出现了一个错误:
运行时错误:线程只能启动一次。

对于现在才来到这个问题的人,请参考:https://dev59.com/3G855IYBdhLWcg3woV0_。(从IPython中有一种官方支持的方法可以做到这一点。) - Linuxios
2个回答

80

我只是使用这个:

from IPython import embed; embed()

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


更新:

为庆祝此答案获得50个赞,以下是自发布以来的六年间我对此片段所做的更新。

首先,我现在喜欢在一个语句中导入和执行,因为我现在所有的 Python 代码都使用 black 进行格式化,而黑色对原始代码进行了一种在此具体且不寻常的情况下不合理的重新格式化。 所以:

 __import__("IPython").embed()

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

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

如果需要退出主进程,我可以简单地使用q()

我的完整代码片段(带有# FIXME,以防我忘记删除它!)如下:

q = __import__("functools").partial(__import__("os")._exit, 0)  # FIXME
__import__("IPython").embed()  # FIXME  

我喜欢使用这个工具来探索新项目。我创建了一个 bit.ly URL j.mp/ipshell,可以在我的代码中使用 curl 命令。它指向 https://gist.github.com/RichardBronosky/570492。 - Bruno Bronosky

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解释器,并检查对象或程序状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接