为了在Python脚本中添加一个即席调试器断点,我可以插入以下代码行:
这样做是有效的,但与普通的
使用方法:
import pdb; pdb.set_trace()
Pdb 从标准输入读取,所以如果脚本本身也从标准输入读取,它就不能正常工作。为了解决这个问题,在类 Unix 系统上,我可以让 pdb 从终端读取:参考链接。
import pdb; pdb.Pdb(stdin=open('/dev/tty', 'r'), stdout=open('/dev/tty', 'w')).set_trace()
这样做是有效的,但与普通的
pdb.set_trace
不同,我无法获得readline库提供的命令行编辑功能(箭头键等)。如何在不干扰脚本的标准输入和输出的情况下进入pdb,并仍然获得命令行编辑?理想情况下,相同的代码应适用于Python 2和Python 3。与非Unix系统的兼容性将是一个奖励。作为测试用例的玩具程序:#!/usr/bin/env python
import sys
for line in sys.stdin:
#import pdb; pdb.set_trace()
import pdb; pdb.Pdb(stdin=open('/dev/tty', 'r'), stdout=open('/dev/tty', 'w')).set_trace()
sys.stdout.write(line)
使用方法:
{ echo one; echo two; } | python cat.py
cmd
和raw_input
似乎硬编码了stdin的使用一样,脚本可能正在使用其他硬编码stdin的库。 - Gilles 'SO- stop being evil'pdb
/cmd
/readline
来深入挖掘并可能进行子类化。我也考虑了一下最少的代码来获得所需的结果。总之,我扩展了这个例子,也许把它放在模块内(除了sys
重新分配之外),可能对您的情况更有帮助? - Ondrej K.