在执行功能时放入python解释器


90

我有一个带有功能的python模块:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

有没有办法放入我有评论的命令行解释器?因此,如果我在python中运行以下命令:

>>> import my_module
>>> do_stuff(1)

我得到我的评论的范围和上下文中的下一个提示do_stuff()


Answers:


60

插入

import pdb; pdb.set_trace()

此时将进入python调试器

参见此处:http : //docs.python.org/library/pdb.html


pdb是伟大的香草蟒蛇;如果您有引入外部软件包的空间,那就ipdb太好了-与调试器相同的功能,但具有ipython的语法突出显示,制表符补全等功能
khstacking

更新— ipdb已过时,如今,我使用pdbpppdb++具有相似的功能,并且可以使用import pdb; pdb.set_trace()(即,它导入了补丁程序,因此它是直接替代品)
漂流者

@hangtwenty:为什么你说过ipdb时了?我找不到任何消息。
尼克·马特奥

@Kundor呵呵,你是对的。我清楚地记得在某处读过一些文章,作者决定停止维护该项目,并指出要使用另一个项目。也许那件事发生了一点,然后又复活了?我可能是错的!无论哪种情况,我ipdb以前pdbpp
都很

141

如果需要标准的交互式提示(而不是调试器,如prestomation所示),则可以执行以下操作:

import code
code.interact(local=locals())

请参阅:代码模块

如果安装了IPython,而要使用IPython Shell,则可以对> = 0.11的IPython执行此操作:

import IPython; IPython.embed()

或旧版本:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())

27
对于IPython> = 0.11,在IPython中不再有Shell模块...因此,请改为使用“ import IPython; IPython.embed()”启动它。
evandrix 2011年

进入code.interact()la PDB 后是否可以继续c(ontinue)
尼克T

4
code.interact()是一个阻止呼叫。您的程序将停止并等待其完成。如果退出交互式解释器,您的程序应从紧随其后的语句继续。
马特·安德森

1
交互式提示和调试器之间有什么区别?
–StockB

1
@StockB这是使其变得重要的标准交互式提示。调试器是一个交互式提示,但并不相同。在PDB中,您无法执行多行语句,无法help覆盖内置函数,等等
。– kbrose

28

如果您想要默认的Python解释器,则可以执行

import code
code.interact(local=dict(globals(), **locals()))

这将允许访问本地人和全局人。

如果要放入IPython解释器,则IPShellEmbed解决方案已过时。当前有效的是:

from IPython import embed
embed()

8
谢谢,code.interact(local=dict(globals(), **locals()))code.interact(local=locals())因为后者使您重新导入软件包要好得多
s2t2 2015年

因为我正在使用bash脚本来调用我的python代码,所以这个答案对我来说效果更好。我无法使用接受的答案与我的python代码进行交互。谢谢!
jonathanking
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.