对于我的调试需求,pdb
是相当不错的。然而,如果我可以进入ipython
,它将会变得更冷(并且有帮助)很多。这可能吗?是否有可能从代码进入ipython?
回答
有一个ipdb
项目,该项目的IPython嵌入到标准的pdb,所以你可以这样做:
import ipdb; ipdb.set_trace()
这是安装通过通常pip install ipdb
。
ipdb
很短,所以不是easy_installing你也可以在Python路径上创建文件ipdb.py
地方和以下内容粘贴到文件中:
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)
通常,当我使用ipython的时候,我会用它里面的“pdb”命令打开自动调试。
然后,在我的脚本所在的目录中使用“run myscript.py”命令运行我的脚本。
如果我得到一个异常,ipython会停止调试器中的程序。退房的帮助下命令IPython的命令魔术(%魔法)
所以没有写东西像ipython.set_trace的方式()? :) – Geo 2009-07-14 18:10:08
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
将编程启动一个IPython的壳。显然,namespace
字典中的值只是虚拟值 - 在实践中使用locals()
可能更有意义。
请注意,您必须对此进行硬编码;它不会像pdb
那样工作。如果这就是你想要的,DoxaLogos的答案可能更像你正在寻找的东西。
的
import pdb; pdb.set_trace()
等效与IPython是类似的:
from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()
这有点冗长,但很高兴知道你是否没有安装ipdb。呼叫需要一次来设置配色方案等,并且set_trace
呼叫可以放置在任何需要中断的地方。
的快速而简便的方法:
from IPython.Debugger import Tracer
debug = Tracer()
然后只写
debug()
,无论你想开始调试程序。
`ImportError:在python 3.4/IPython上没有名为'IPython.Debugger'的模块3 – ostrokach 2015-05-31 15:33:37
在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
这是当你运行它会发生什么(我随意选择运行现有的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
我想简单地粘贴在我的脚本这一个班轮,我想设置一个断点:
__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
较新的版本可以使用:
__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
如果你使用更现代版本的IPython(> 0.10.2),您可以使用类似
from IPython.core.debugger import Pdb
Pdb().set_trace()
但是,它可能会更好地使用ipdb
看起来模块最近已经混乱了一点。在IPython的0.13.1以下工作对我来说
from IPython.core.debugger import Tracer; breakpoint = Tracer()
breakpoint() # <= wherever you want to set the breakpoint
虽然很可惜,这一切都非常worthless in qtconsole。
较新版本的IPython提供了一种将IPython会话嵌入和嵌套到任何Python程序的简单机制。您可以按照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)
然后使用ipshell()
,每当你想放到一个IPython的外壳。这将允许您在代码中嵌入(甚至嵌套)IPython解释器。
我不得不谷歌这一对夫妇,如果时间过去几天所以添加一个答案...有时很高兴能够正常运行脚本,只有放入ipython/ipdb的错误,而不必把ipdb.set_trace()
断点到代码
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(第一pip install ipython
和pip install ipdb
当然)
- 1. 是否有可能阅读并进入.NET Framework源代码
- 2. 是否有可能使用Tuples进行WP7 Beta编译代码?
- 3. 是否有可能改进此代码以获得速度?
- 4. 是否有可能在不进入REPL的情况下编译clojure源代码?
- 5. 是否有可能在android应用程序中注入代码?
- 6. 是否有可能导入Android包到普通的Java代码
- 7. 是否有可能从Visual Studio(VB.NET)复制代码而不需要缩进?
- 8. 是否有可能从代码内生成卫星组件?
- 9. 是否有可能从Lua代码加载.net dll?
- 10. 是否有可能从java代码制作.so库?
- 11. 是否有可能从VS代码中删除阴影
- 12. 是否有可能从代码背后触发AJAX CollapsiblePanelExtender动画?
- 13. 是否有可能从其他网站读取PHP代码?
- 14. 是否有可能从这段代码中检索2个值?
- 15. 是否有可能从后面的代码写入本地资源文件?
- 16. 是否有可能取代使用jQuery的颜色代码?
- 17. 是否有可能直接在代码中有错误描述?
- 18. 是否有可能拥有多个共享代码的项目?
- 19. 是否有可能从云中调用Parse定义的云代码功能?
- 20. iPython代码完成/点上的智能感知可能吗?
- 21. 是否可能将图片插入代码评论?
- 22. 是否有PHP的IDE,您可以设置断点并进入代码?
- 23. 是否有可能检查MD5密码
- 24. 是否有可能进入用pyc编译的IronPython dll?
- 25. 是否有可能确定dom元素何时进入视图?
- 26. 是否有可能将.NET IL代码编译为机器代码?
- 27. 是否有可能在提示输入,并用此代码输出
- 28. 是否有可能将LLVM位代码文件读入到llvm :: Module中?
- 29. 是否有可能在TextWrangler中阻止评论Python代码
- 30. 是否有可能使用python编译c代码?
太棒了!这太酷了! – Geo 2009-07-14 18:22:02
与Django的效果非常好。好吧,除了我看不到我输入的文本,但这可能很容易修复(因为ipdb只有六行)。 – 2010-01-24 12:50:38
实际上,问题在于Django为runserver分配了一个单独的线程,并且在您进行代码编辑时,它会重新生成线程。这通常工作正常,但如果你坐在pdb线程死亡,终端疯了。你可以通过跳出runserver,runniny'stty sane'来解决这个问题,然后再次启动runserver。 – 2011-09-12 20:17:13