我一直在寻找类似的东西,但 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()应该打印“Hello from pdbrc”并立即继续程序执行,然后第二个pdb.set_trace()应该打印“Hello again!”并留在 pdb 环境中。
警告:如果您依赖的主目录中有一个现有的 .pdbrc 文件,请确保您不会覆盖它(例如,确保您有备份)。
UPDATE 事实证明,您可以通过编程方式附加到 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 instance 成功进行首次跟踪后,pdb.rcLines 列表将被清除,您应该使用您需要的任何新命令重新填充它从此实例执行第二次跟踪。