我想保护自己免受编码错误的影响。许多解决方案将涉及替换sys.stdout
,但这会阻止箭头键的识别,并阻止对当前行的良好编辑或调用pdb
或ipython
中的过去命令。 Ctrl-R
也被打破了。删除有效。由于某些原因,似乎读取设施都已消失或未被触发。
这是一个简单的例子,应该是无害的,因为它只是将输入传递给旧的sys.stdout
而无需改变:
cat <<EOF > /tmp/example.py
import sys
from codecs import StreamWriter
class TestWriter(StreamWriter):
def write(self, obj):
return self.stream.write(obj)
import pdb; pdb.set_trace() ## before replacing stdout, all works
sys.stdout = TestWriter(sys.stdout) ## Type 'n' in pdb
pass ## 'pdb' shell is screwed up.
EOF
python /tmp/example.py
然而,这也失败了。由于某些原因,这不会发生在python3中,而只发生在python2.7上。
幕后会发生什么?为什么这会失败?这可以避免吗?