gpt4 book ai didi

python - 从 python 中的 sys.stderr 读取

转载 作者:行者123 更新时间:2023-12-01 05:01:22 27 4
gpt4 key购买 nike

这里有无数关于如何从子进程的 stderr 和 stdout 读取数据的问题。是否可以使用当前进程的 stderr 来执行此操作?我检查了它,它引发了 IO 错误:文件未打开以供读取。

我需要读取 stderr 并获取数据以进行进一步处理。有什么方法可以以“r+”模式打开文件吗?

我想到的一种方法是使用如下类覆盖默认的 sys.stderr:

class CustomStdErr(object):
def write(self, data):
with open(fakestderr, 'r+') as f:
f.write(data)

sys.stderr = CustomStdErr()

还有其他更直接的方法吗?

编辑: 为什么我需要 stderr:
代码中有一个线程(称为X)与主线程(称为M)交互。主线程已启用日志记录。这被重定向到 stderr。现在,线程 X 的职责是监视 stderr 并从中读取并为主线程处理它。总而言之,这就是正在发生的事情。

最佳答案

嗯,你不能直接做你想做的事。如果一个线程写入默认sys.stderr,默认情况下它将转到终端,并且其他线程无法读取它。

但是...您始终可以将 sys.stderr 更改为具有采用字符串参数的 write 方法的任何对象(摘自标准 Python 库的文档) sys 模块:stderr 不需要是内置文件对象:任何对象都可以接受,只要它有 write() 采用字符串参数的方法。(更改这些对象不会影响 os.popen()os.system() 执行的进程的标准 I/O 流> 或 os 模块中的 exec*() 系列函数。))

简而言之:如果您线程直接写入 sys.stderr,您可以使用 os.pipe() 创建一对管道,影响 的写入结束>sys.stderr,从监控线程读取读取端 - 仍然可以写入 sys.__sterr__sys.stderr 的保存值

如果您的线程启动子进程,请使用 subprocess.Popen 对象将子命令的 stderr 流重定向到管道并从监视线程读取它。

关于python - 从 python 中的 sys.stderr 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26087175/

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