是否有可能从代码进入ipython?

Geo*_*Geo 78 python debugging shell ipython pdb

对于我的调试需求,pdb非常好.然而,这将是很大冷却器(和有益的),如果我能进入ipython.这件事有可能吗?

Dan*_*man 109

有一个ipdb项目将iPython嵌入到标准的pdb中,所以你可以这样做:

import ipdb; ipdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

它可以通过常规安装pip install ipdb.

ipdb非常简短,因此您可以ipdb.py在Python路径上的某处创建一个文件,并将以下内容粘贴到文件中,而不是easy_installing :

import sys
from IPython.Debugger import Pdb
from IPython.Shell import IPShell
from IPython import ipapi

shell = IPShell(argv=[''])

def set_trace():
    ip = ipapi.get()
    def_colors = ip.options.colors
    Pdb(def_colors).set_trace(sys._getframe().f_back)
Run Code Online (Sandbox Code Playgroud)

  • 实际上,问题在于Django为runserver分配一个单独的线程,并且每当你进行代码编辑时,它都会重新生成线程.这通常可以正常工作,但是如果你在线程被杀死时坐在pdb中,终端就会疯狂.你可以通过打破runserver,runniny'stty sane',然后再次启动runserver来解决这个问题. (4认同)

Ale*_*dio 53

在IPython 0.11中,您可以直接在您的代码中嵌入IPython

您的程序可能如下所示

In [5]: cat > tmpf.py
a = 1

from IPython import embed
embed() # drop into an IPython session.
        # Any variables you define or modify here
        # will not affect program execution

c = 2

^D
Run Code Online (Sandbox Code Playgroud)

这是当你运行它时会发生的事情(我任意选择在现有的ipython会话中运行它.在我的经​​验中嵌入这样的ipython会话会导致它崩溃).

In [6]:

In [6]: run tmpf.py
Python 2.7.2 (default, Aug 25 2011, 00:06:33)
Type "copyright", "credits" or "license" for more information.

IPython 0.11 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: who
a       embed

In [2]: a
Out[2]: 1

In [3]:
Do you really want to exit ([y]/n)? y


In [7]: who
a       c       embed
Run Code Online (Sandbox Code Playgroud)

  • @gerrit,如果你还在那里,按Ctrl + d. (2认同)
  • @ confused00 6个月之后,这本来是无限的;-) (2认同)

小智 12

如果您使用的是更现代版的IPython(> 0.10.2),您可以使用类似的东西

from IPython.core.debugger import Pdb
Pdb().set_trace()
Run Code Online (Sandbox Code Playgroud)

但是使用ipdb可能更好


ars*_*ars 11

相当于

import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

与IPython是这样的:

from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()
Run Code Online (Sandbox Code Playgroud)

它有点冗长,但很高兴知道你是否安装了ipdb.该make_session呼叫需要一次设置的配色方案等,并set_trace调用可以放在任何地方,你需要打破.


Jay*_*son 8

通常,当我使用ipython时,我会在其中使用"pdb"命令打开自动调试.

然后,我在脚本所在的目录中使用"run myscript.py"命令运行我的脚本.

如果我得到异常,ipython会在调试器中停止程序.查看magic ipython命令的帮助命令(%magic)


xAp*_*ple 8

我想简单地在我想要设置断点的脚本中粘贴这个单线程:

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
Run Code Online (Sandbox Code Playgroud)

较新的版本可能会使用:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
Run Code Online (Sandbox Code Playgroud)


bea*_*rdc 6

看起来模块最近已被洗牌了一下.在IPython 0.13.1上,以下内容适用于我

from IPython.core.debugger import Tracer; breakpoint = Tracer()

breakpoint() # <= wherever you want to set the breakpoint
Run Code Online (Sandbox Code Playgroud)

虽然唉,它在qtconsole中一点都不值钱.


Ame*_*ina 5

较新版本的IPython提供了一种简单的机制,可以将IPython会话嵌入和嵌套到任何Python程序中.您可以按照以下方法嵌入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)
Run Code Online (Sandbox Code Playgroud)

然后ipshell()在你想要进入IPython shell时使用.这将允许您在代码中嵌入(甚至嵌套)IPython解释器.