如何将 IPython 解释器嵌入到在 IPython Qt 控制台中运行的应用程序中
Posted
技术标签:
【中文标题】如何将 IPython 解释器嵌入到在 IPython Qt 控制台中运行的应用程序中【英文标题】:How do I embed an IPython Interpreter into an application running in an IPython Qt Console 【发布时间】:2013-02-16 12:18:48 【问题描述】:这方面有几个话题,但没有一个给出令人满意的答案。
我有一个在 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: 线程只能启动一次
【问题讨论】:
对于现在提出这个问题的人,请参阅:***.com/questions/4234612/…。 (IPython 提供了一种官方支持的方法。) 【参考方案1】:我只是用这个:
from IPython import embed; embed()
对我来说比其他任何东西都好:)
更新:
为了庆祝这个答案获得 50 票赞成,以下是我在这个 sn-p 发布后的六年内对其所做的更新。
首先,我现在喜欢在单个语句中导入和执行,因为这些天我对所有 python 代码都使用black,它重新格式化了原始的 sn-p,这种方式在这个特定的情况下没有意义和不寻常的背景。所以:
__import__("IPython").embed()
鉴于我经常在循环或线程中使用它,包含允许终止父进程的 sn-p 会很有帮助(部分是为了方便,部分是为了提醒自己最好的方法) . os._exit
是这里的最佳选择,所以我的 sn-p 包括这个(使用单个语句的相同逻辑 w/r/t):
q = __import__("functools").partial(__import__("os")._exit, 0)
如果/当我想退出主进程时,我可以简单地使用q()
。
我的完整 sn-p(带有 # FIXME
以防我可能忘记删除它!)看起来像这样:
q = __import__("functools").partial(__import__("os")._exit, 0) # FIXME
__import__("IPython").embed() # FIXME
【讨论】:
我喜欢用它来探索新项目。我创建了一个 bit.ly URL j.mp/ipshell,我可以将它卷曲到我的代码中。它指向gist.github.com/RichardBronosky/570492【参考方案2】:您可以关注the following recipe 将 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)
然后,当您想被放入 IPython shell 时,请使用 ipshell()
。这将允许您在代码中嵌入(甚至嵌套)IPython 解释器并检查对象或程序的状态。
【讨论】:
以上是关于如何将 IPython 解释器嵌入到在 IPython Qt 控制台中运行的应用程序中的主要内容,如果未能解决你的问题,请参考以下文章