gpt4 book ai didi

重定向 sys.stdout 时 Python PDB 交互模式中断

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:06 29 4
gpt4 key购买 nike

sys.stdout 替换为 Tee logger 后(将输出重定向到文件),PDB 不再正常工作。例如,按向上箭头会产生 ^[[A 而不是上一个命令。

可以使用以下代码片段重现该问题:

import sys
import pdb

class Tee(object):
def __init__(self, name, mode):
self.file = open(name, mode)
self.stdout = sys.stdout
sys.stdout = self
def __del__(self):
sys.stdout = self.stdout
self.file.close()
def write(self, data):
self.file.write(data)
self.stdout.write(data)
def flush(self):
self.file.flush()

sys.stdout = Tee('test.txt', 'w')
pdb.set_trace()

有没有办法在不破坏PDB的情况下替换sys.stdout

最佳答案

(1) 您无法在 tee 输出上进行交互,因为它是常规流,而不是终端。终端允许执行大量操作:定位光标、删除内容、读取按键、在屏幕上回显按键等。磁盘上的常规文件无法执行所有这些操作,这就是为什么 pdb 无法在交互模式下执行这些操作。您可以检查在运行 REPL 时 sys.stdout.isatty() 是否返回 True

(2) 您当然可以更改代码中的每个 print 函数调用,以将 stdout 写入您想要的任何文件,因为你可以重新定义print。如果您 from __future__ import print,这适用于 Python 3 和 Python 2.7。然后你可以做这样的事情:

system_print = print  # preserve the original.

def print_also_to(other_file):
def tee_print(*args, **kwargs):
system_print(*args, **kwargs) # Normally prints to stdout.
system_print(*args, **kwargs, file=other_file) # Write a copy.
return tee_print

print = print_also_to(open('/tmp/copy-of-stdout')) # A crude example.

print("Hello world!") # Unmodified code.

使用 print 语句,你的情况会更糟。使用strace on Linux或 macOS 上的 DTrace 来捕获对 stdout(和其他地方)的写入,并在启动进程时将其重定向到文件:

strace -e trace=write -o writes.txt python your-script.py

它将向文件写入类似于 write(1, 'Hello world!') 的内容。您需要解析它并重建输出到 stdout (1),专门生成输出的真实副本。

我想pdb的交互模式也可以在这种情况下工作;至少,Python REPL 在 strace 下工作得很好。

关于重定向 sys.stdout 时 Python PDB 交互模式中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56908046/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com