我正在使用pdb在emacs中调试一些python代码并获得一些导入问题.依赖项安装在我的一个bespoked virtualenv环境中.
Pdb顽固地使用/ usr/bin/python而不是我的virtualenv中的python进程.
我使用virtualenv.el来支持在emacs中切换环境,并通过后面描述的postactivate挂钩
http://jesselegg.com/archives/2010/03/14/emacs-python-programmers-2-virtualenv-ipython-daemon-mode/
这在运行Mx python-shell时效果很好
>>> import sys
>>> print sys.path
Run Code Online (Sandbox Code Playgroud)
这指向我所有的virtualenv库,表明python-shell是我的virtualenv.
然而,这与M-相矛盾!哪个python,它给/ usr/bin/python
有谁知道我怎么能告诉Mx pdb从当前活跃的virtualenv采用python进程?
在eclipse(以及其他几个IDE)中,有一个选项可以在一定数量的命中之后打开断点.在Python中pdb
,断点有一个命中计数,并且有condition
命令.我如何连接它们?
我IPython(0.13.1)
和ipdb(0.7)
安装,我插线import ipdb;ipdb.set_trace()
在我的剧本跑python my_script.py
.现在我在ipdb提示符下并且有一些自动完成(例如一个裸标签),但它与我进入IPython时获得的自动完成功能不同.在ipdb提示符中,requests.
然后<tab>
(导入后)没有像IPython那样给我一个属性列表.如何使用ipdb获得与IPython相同的选项卡完成?
顺便说一下,当我运行python -m ipdb my_script.py
选项卡完成时,就像在IPython中一样,但是它的缺点是它从第一行启动调试器而不是我放的行import ipdb;ipdb.set_trace()
.
我想像调试任何其他Python代码一样调试Django TestCase:只需调用pdb.set_trace()
然后进入交互式会话即可.当我这样做时,我没有看到任何东西,因为测试是在不同的过程中运行的.我正在使用django-discover-runner,但我的猜测是这适用于默认的Django测试运行器.
是否可以在每次错误/失败pdb
时使用django-discover-runner
a)进入会话,和/或b)只有在我调用pdb.set_trace()
我的测试代码时?
这个答案解释了Django创建了另一个进程,并建议使用rpdb2 debugger
一部分调用winpdb
,但我不想使用winpdb
,我宁愿使用ipdb
.
这个答案django-nose
通过运行如下所示的测试命令解决了问题:./manage.py test -- -s
但该选项不可用django-discover-runner
.
这个答案显示我可以这样做ipython
:
In [9]: %pdb
Automatic pdb calling has been turned ON
Run Code Online (Sandbox Code Playgroud)
这似乎是一个潜在的选择,但ipython
每次运行测试时启动它似乎有点麻烦.
最后,这个答案表明nose
带有一个--pdb
标志,它会pdb
出现错误,这就是我想要的.我唯一的选择是切换到django-nose
测试跑步者?
我在内置帮助中没有看到任何选项django-discover-runner
:
$ python manage.py help test --settings=settings.test
Usage: manage.py test [options] [appname ...]
Runs …
Run Code Online (Sandbox Code Playgroud) 使用python 3.5.1
当我使用python调试器模块运行脚本时:
[home]# python -m pdb myscript.py
Run Code Online (Sandbox Code Playgroud)
这将启动调试会话:
> /somepath/to/myscript.py(1)<module>()
-> import os
(Pdb)
Run Code Online (Sandbox Code Playgroud)
如果我想从调试会话中进入交互式终端,我可以发出interact
命令:
(Pdb) interact
*interactive*
>>>
Run Code Online (Sandbox Code Playgroud)
现在我可以用个代码交互,就好像我是在一个运行Python交互模式,能够访问任何功能或变量在我输入的时间调试器中运行该脚本的范围interact
模式.
当我发出退出交互模式的命令(继续调试)时,它会终止整个调试会话:
>>> exit()
The program exited via sys.exit(). Exit status: None
....long nasty stack trace here....
[home]#
Run Code Online (Sandbox Code Playgroud)
我也试过quit()
,它也终止了调试器.
如何在interact
不终止整个调试会话的情况下退出模式?这甚至可能吗?
理想情况下,我想在我离开的时候返回调试模式,这样我就可以继续单步调试代码了.
我正在尝试调试我编写的Python CLI,它可以从stdin获取其参数.一个简单的测试用例将具有输出
echo "test" | python mytool.py
Run Code Online (Sandbox Code Playgroud)
相当于.的输出
python mytool.py test
Run Code Online (Sandbox Code Playgroud)
我想用这个工具调试一些问题,所以我试着运行它:
echo "test" | pdb mytool.py
Run Code Online (Sandbox Code Playgroud)
但我得到这个输出,然后pdb退出:
> /path/to/mytool.py(5)<module>()
-> '''
(Pdb) *** NameError: name 'test' is not defined
(Pdb)
Run Code Online (Sandbox Code Playgroud)
当我添加-m python
到shebang时,如果我pdb.set_trace()
在脚本中运行,则会发生同样的事情.
这里发生了什么?
我有python脚本(ala#!/ usr/bin/python),我想用pdb调试它.如何将参数传递给脚本?
我有一个python脚本,并希望用pdb调试它.有没有办法可以将参数传递给脚本?
说我有以下代码的代码:
for i in range(100):
print i
Run Code Online (Sandbox Code Playgroud)
一般来说,我可以在代码中添加一行:
for i in range(100):
import ipdb;ipdb.set_trace()
print i
Run Code Online (Sandbox Code Playgroud)
但是,现在我想在条件下调试它i == 10
,我不想c
在ipdb中输入10次,我该怎么办?
在我找到的文档中condition bpnumber [condition]
,但我怎么知道bpnumber
是否没有bpnumber
索引列表.文档还说b(reak) ([file:]lineno | function) [, condition]
.例如,假设行号print i
是xx
.我在ipdb shell中输入了以下内容:b xx, i == 10
但没有按预期发生.
编辑
不幸的是,目前这是不可能的.我发现这是Spyder的一个错误.开发人员仍在研究如何处理这个问题.
在调试代码时可视化数据(我也想使用Spyder!).
使用以下代码创建名为foo.py的文件:
from ipdb import set_trace as st
import matplotlib.pyplot as plt
def bar():
st()
Run Code Online (Sandbox Code Playgroud)在IPython中,键入以下内容:
In [4]: import foo
In [5]: foo.bar()
--Return--
None
> somewhere_over_the_rainbow\foo.py(5)bar()
3
4 def bar():
----> 5 st()
ipdb> plt.plot([1, 2], [3, 4])
[<matplotlib.lines.Line2D object at 0x05CA8E90>]
ipdb> plt.show()
Run Code Online (Sandbox Code Playgroud)情节仍处于"冻结"状态.如果我退出调试器,则绘制更新.如果我试图关闭情节,IPython会崩溃.显然两者都不受欢迎,也不让我在调试时看到数据.
从命令行打开IPython:
In [4]: import foo
In [5]: foo.bar()
--Return--
None
> somewhere_over_the_rainbow\foo.py(5)bar()
3
4 def bar():
----> 5 st()
ipdb> plt.plot([1, 2], …
Run Code Online (Sandbox Code Playgroud)我有一些非常奇怪的行为,我只是不明白,因此无法解释,所以我希望有人可以帮助我.我注意到的第一件事是ipdb不再让我定义变量:
ipdb> what=5
ipdb> what
*** NameError: name 'what' is not defined
whatelse=6
Run Code Online (Sandbox Code Playgroud)
稍后我发现ipdb在我的输入上返回了这个(在再次运行代码之后):
dir()
ipdb> ['args', 'content_type', 'function', 'ipdb', 'item_code', 'kwargs', 'object_id', 'request', 'ud_dict', 'update_querydict', 'what', 'whatelse']
what=5
ipdb> what
5
ipdb> whatelse=7
ipdb> whatelse
ipdb> 6
whatelse
ipdb> 7
whatelse
ipdb> 6
whatelse
ipdb> 7
Run Code Online (Sandbox Code Playgroud)
对我来说,这看起来像我有两个交错调试会话,我可以访问一些奇怪的交替模式.我怎么能摆脱它呢?
编辑: 杀死所有python进程并重新运行代码确实有帮助.现在一切都恢复正常了.但是由于我不明白发生了什么,我会对发生的事情以及如何重现行为非常感兴趣.