【问题标题】:Execute user-input pdb or ipdb commands programmatically in Python在 Python 中以编程方式执行用户输入的 pdb 或 ipdb 命令
【发布时间】:2018-10-26 19:13:56
【问题描述】:

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

换句话说,我试图找到一个基本上是ipdb.run_user_input(my_string) 的函数,其中my_string 可以是任何普通的ipdbpdb 函数,例如nextcsteplist

谢谢!

【问题讨论】:

    标签: python-3.x pdb ipdb


    【解决方案1】:

    我一直在寻找类似的东西,但 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 列表将被清除,您应该使用您需要的任何新命令重新填充它从此实例执行第二次跟踪。

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多