我正在使用PyQt应用程序,因此在开始调试之前,在Python文件中,我先行pyqtRemoveInputHook()
停止事件循环,然后再行ipdb.set_trace()
。这将通过终端进入交互式调试会话。完成调试后,我需要手动输入终端c; pyqtRestoreInputHook()
才能继续运行程序并恢复事件循环。 c
告诉ipdb
或pdb
继续,pyqtRestoreInputHook()
被解释为Python代码。尽管不太麻烦,但我还是想创建一个函数,该函数允许python命令告诉ipdb
或pdb
某个给定的字符串是伪键盘命令。
换句话说,我正在尝试找到一个基本上是ipdb.run_user_input(my_string)
的函数,其中my_string
可以是任何普通ipdb
或pdb
函数,例如{{1 }},next
,c
,step
等
谢谢!
答案 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
列表已清除,您应该使用任何新命令重新填充它您需要从该实例执行第二次跟踪。