我最近从ipython0.10切换到ipython0.11.在ipython0.11中,我只看到python调试器参与(即使用%pdb)时的完整回溯的一小段,而在ipython0.10中我会看到完整的回溯.据我所知,pdb命令行无法直接访问完整的回溯 - 您可以使用'u'浏览它,但无法直接看到它.
那么,有没有办法显示完整的追溯?比如配置参数?
或者,更有用的是,有没有办法让ipython只显示被捕获的异常,而不是显示它被捕获的代码中的位置?
编辑:示例:
In [1]: pdb
Automatic pdb calling has been turned ON
In [2]: 1/0
> <ipython-input-2-05c9758a9c21>(1)<module>()
-1 1/0
ipdb> q
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/Users/adam/<ipython-input-2-05c9758a9c21> in <module>()
----> 1 1/0
ZeroDivisionError: integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)
我想在 q退出pdb 之前看到ZeroDivisionError .
我试图向服务器发出http请求并检查我得到的内容.但是,当我尝试使用HTTPResponse objectwith ipdb,我不断得到*** Oldest frame而且我无法运行我应该能够运行的对象上的任何函数.这是用于获取的代码块和ipdb输出:
代码块:
for acc in sp_lost:
url = 'http://www.uniprot.org/uniprot/?query=mnemonic%3a'+acc+'+active%3ayes&format=tab&columns=entry%20name'
u = urllib.request.urlopen(url)
ipdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
ipdb输出:
ipdb> url
'http://www.uniprot.org/uniprot/?query=mnemonic%3aSPATL_MOUSE+active%3ayes&format=tab&columns=entry%20name'
ipdb> u
*** Oldest frame
ipdb> str(u)
'<http.client.HTTPResponse object at 0xe58e2d0>'
ipdb> type(u)
<class 'http.client.HTTPResponse'>
ipdb> u.url
*** Oldest frame
ipdb> u.url() # <-- unable to run url() on object...?
*** Oldest frame
ipdb>
Run Code Online (Sandbox Code Playgroud)
这是什么*** Oldest frame意思,我怎样才能将这个对象变成更有用的东西,我可以运行相应的函数?
之前已经问过这个问题,但我找不到一个好的答案.所以,我想再问一次.
我希望我的ipdb能够记住跨会话的命令.现在,它可以提取在Ipython会话中执行的命令,但不能从旧的ipdb会话中提取.如果我可以拥有此功能,那将节省大量时间.
有没有人有这个问题的解决方案?
如果我使用调试器,大多数时候我只想看看解释器在我的代码中做了什么.我想跨越我使用的框架和库的所有代码.
AFAIK这称为黑拳击.
如何使用Python ipdb或其他Python调试器执行此操作?
想象一下:
我使用了一个我信任的orm框架,并且不想调试.
cut_hair_method(orm_object.user)
Run Code Online (Sandbox Code Playgroud)
方法cut_hair_method()是我的,我想调试它.
这orm_object是我使用的框架.调试器将进入orm-code并做一些我不关心的特殊事情.我没办法告诉调试器:不要跳进orm代码!
更新
对于我来说,这将是很容易的决定哪些代码应该是在黑盒子和代码没有:代码中$VIRTUAL_ENV/src/是不是在黑盒子,所有其他的代码.除了我明确告诉调试器别的东西.
UPDATE2
我从这篇文章中得到了"Black Boxing"的名称:https://hacks.mozilla.org/2013/08/new-features-of-firefox-developer-tools-episode-25/
在我的python代码中,我有几个级别的调用堆栈,如下所示:
f1:user_func1
f2:**user_func2**
f3:third_party_func1
f4:third_party_func2
f5:exception happens here.
Run Code Online (Sandbox Code Playgroud)
第三方代码中某处发生异常(框架f5)。我使用ipdb进入发生异常的框架,并使用up命令“ u”将调试器带回到我的代码调用第三方代码的框架(框架f2)。
有时第三方代码中有很多级别,因此我需要按多次。有没有办法将调试器快速带入调用第三方代码的代码框架?
在 Python(2.7,在 Linux 上运行)中调试脚本时,我偶尔会注入 pdb.set_trace()(注意我实际上使用的是 ipdb),例如:
import ipdb as pdb
try:
do_something()
# I'd like to look at some local variables before running do_something_dangerous()
pdb.set_trace()
except:
pass
do_something_dangerous()
Run Code Online (Sandbox Code Playgroud)
我通常从 shell 运行我的脚本,例如
python my_script.py
Run Code Online (Sandbox Code Playgroud)
有时在我的调试会话期间,我意识到我不想运行 do_something_dangerous()。停止程序执行以便 do_something_dangerous() 不运行并且我可以退出到 shell 的最简单方法是什么?
据我了解,按 ctrl-d (或发出调试器的退出命令)将简单地退出 ipdb 并且程序将继续运行(在我上面的示例中)。按 ctrl-c 似乎会引发 KeyboardInterrupt,但我从未理解引发它的上下文。
我希望像 ctrl-q 这样的东西可以简单地取消整个过程,但我找不到任何东西。
我知道我的示例是人为设计的,但我的问题是当正在调试的代码设置为捕获异常时如何从 pdb 中止执行。这不是关于如何重组上面的代码使其工作!
我正在使用 docker-compose 构建我的 docker 容器,并使用如下--service-ports标志运行容器:
docker-compose run --service-ports $(service_name) -d
Run Code Online (Sandbox Code Playgroud)
当尝试在容器中的 python 脚本中调用 ipdb 时,使用import ipdb; ipdb.set_trace()ipdb 已初始化,但我无法在控制台中输入任何内容。我也有以停止手动重新启动终端会话(CTRL+C,CTRL+D等什么都不做)。也不是终端已经冻结,因为我仍然可以向后滚动,并且在聚焦/不聚焦时光标也会改变外观。
任何想法如何解决这一问题?
在Jupyter Notebook中使用调试器时,我一直遇到问题,特别是以下命令:
from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger
Run Code Online (Sandbox Code Playgroud)
每当我使用Tracer()()时,内联调试器就会按预期显示,但是一旦在字段中输入任何命令:n(ext),s(tep)等,我就会跳到该行:
finally:
# Reset our crash handler in place
sys.excepthook = old_excepthook
Run Code Online (Sandbox Code Playgroud)
这是问题和尝试调试的代码的图像(确切的代码无关,因为我能够在其他笔记本上重现该问题)。
我正在Mac上运行OSX El Capitan,并使用Anaconda for python 2.7。这是有关通过运行获得的当前设置的一些详细信息:
conda info --all (from root env)
Run Code Online (Sandbox Code Playgroud)
注意,我尝试了几种不同的调试选项:pdb,ipdb和Tracer(),但是每个选项都遇到了单独的问题。根据Stackoverflow问题(使用ipdb调试Jupyter中的Python代码),此时 Tracer()似乎是标准选项。
此外,我已经能够在运行Windows 7的Dell计算机上复制此问题。
任何帮助将不胜感激!
# process_with_huge_time_overhead()
list_a = [1,2,3]
print(list_a[3])
# process_with_huge_time_overhead()
new_data = [5,6,7]
list_a += new_data
Run Code Online (Sandbox Code Playgroud)
到达 ipdb 中的这一行(通过调用python -m ipdb script.py)后,抛出异常:IndexError

如何继续调试和跳转而不经历再次到达这一点的开销?
如果我跳到第62行,用n命令执行下一行,是不行的。everyn只是继续退出程序。
导入任何与 pyqt 相关的内容后,我无法在 ipython 中使用调试器。
如果我不导入任何东西并调试像
$ ipython3
In [1]: abc
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-03cfd743661f> in <module>
----> 1 abc
NameError: name 'abc' is not defined
In [2]: %debug
> <ipython-input-1-03cfd743661f>(1)<module>()
----> 1 abc
ipdb>
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是如果我使用 pyqt5 后端启动 ipython3,我会得到
$ ipython3 --pylab=qt5
In [1]: abc
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-03cfd743661f> in <module>
----> 1 abc
NameError: name 'abc' is not defined
In [2]: %debug
> <ipython-input-1-03cfd743661f>(1)<module>()
----> 1 abc
ipdb> QObject: Cannot create …Run Code Online (Sandbox Code Playgroud)