gpt4 book ai didi

python - fileno() 可以返回文件包装对象的句柄而不是实际文件吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:33 26 4
gpt4 key购买 nike

作为我正在编写的 python 项目的一部分,我有一个包装 stdout 流和文件的对象。然后,我的类上的 write() 方法会写入流和文件。然后,我将 sys.stdout 设置为我的对象,以便任何 sys.stdout.write() 调用 - 即 print("blah") - 都将写入 stdout和我的日志文件。这一切都运行良好。

简化后,它看起来有点像这样:

import sys

class StreamLogger():
def __init__(self, fileobj):
self.file = fileobj
self.stream = sys.stdout

def activate(self):
sys.stdout = self
def deactivate(self):
sys.stdout = self.stream

def write(self, text):
self.file.write()
self.stream.write()

这工作得很好,直到我开始使用对子流程模块的调用。 Popen 代码在其标准输出上调用 fileno()Other questions建议在包装对象上调用 fileno 。但我有两个包裹好的物体。如果我返回其中一个,则 stdout 仅写入该流/文件,而不写入另一个。

有什么我可以从 fileno() 返回的东西来允许我的类写入两个流吗?

最佳答案

简短的回答是,你不能。子进程直接将您提供的标准输出描述符传递给它创建的进程。由于您的包装类不是操作系统文件,因此它不能直接传递给新进程。

您可以使用os.pipe缓冲数据,但在这种情况下,最好只使用 subprocess.PIPE stdout 的值并使用 Popen.communicate()检索进程写入标准输出的数据。

关于python - fileno() 可以返回文件包装对象的句柄而不是实际文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21075608/

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