在Python中以编程方式执行用户输入的pdb或ipdb命令

时间:2018-10-26 19:13:56

标签: python-3.x pdb ipdb

我正在使用PyQt应用程序,因此在开始调试之前,在Python文件中,我先行pyqtRemoveInputHook()停止事件循环,然后再行ipdb.set_trace()。这将通过终端进入交互式调试会话。完成调试后,我需要手动输入终端c; pyqtRestoreInputHook()才能继续运行程序并恢复事件循环。 c告诉ipdbpdb继续,pyqtRestoreInputHook()被解释为Python代码。尽管不太麻烦,但我还是想创建一个函数,该函数允许python命令告诉ipdbpdb某个给定的字符串是伪键盘命令。

换句话说,我正在尝试找到一个基本上是ipdb.run_user_input(my_string)的函数,其中my_string可以是任何普通ipdbpdb函数,例如{{1 }},nextcstep

谢谢!

1 个答案:

答案 0 :(得分:0)

我一直在寻找类似的东西,但是pdb似乎并不能让您以编程方式运行一系列pdb命令。

但是,它确实使您可以从.pdbrc文件中读取一系列pdb命令,这些命令在放入任何pdb会话后将立即执行。

非常感谢documentation

run *函数和set_trace()是用于实例化Pdb类和调用同名方法的别名。

...换句话说,每次对pdb的调用似乎都实例化了该类的新实例,其中readrc参数默认为true,因此您可以仅创建一个新的.pdbrc文件调用之前,新文件将被提取并执行。

因此,仅在调用pdb.set_trace之前在当前目录中写入.pdbrc文件就足够了,其中包含您感兴趣的命令序列。例如

import pdb;

with open( '.pdbrc', 'w') as f: 
    print( "print('Hello from pdbrc')", file = f )
    print( "continue", file = f )

pdb.set_trace()

with open( '.pdbrc', 'w') as f:
    print( "print('Hello again!')", file = f )

pdb.set_trace()

在上面的示例中,第一个pdb.set_trace()应该打印“来自pdbrc的Hello”并立即继续执行程序,然后第二个pdb.set_trace()应该打印“ Hello again!”。并保留在pdb环境中。


警告:如果您的主目录中已有一个现有的.pdbrc文件,请确保您不会覆盖它(例如,确保有备份)。 / p>


更新,事实证明您可以以编程方式附加到rc行,从而无需完全在磁盘上创建文件。请注意,您不能直接在模块pdb上执行此操作,需要首先创建一个Pdb类实例。

import pdb
pdb = pdb.Pdb()   # or pdb = pdb.Pdb( readrc = False )  if you want to ignore your existing .pdbrc
pdb.rcLines.append( "print('Hellooo')" )
pdb.rcLines.append( "continue" )
pdb.set_trace()

这样做的好处是,除非您使用readrc = False参数进行调用,否则将尊重您现有的.pdbrc文件,并且以编程方式附加的任何命令都将有效地附加到pdbrc派生的命令中。

但是,请注意,由于某种原因,在通过此pdb 实例成功进行第一次跟踪之后,pdb.rcLines列表已清除,您应该使用任何新命令重新填充它您需要从该实例执行第二次跟踪。