gpt4 book ai didi

Python `tee` 子进程的标准输出

转载 作者:太空狗 更新时间:2023-10-29 20:11:40 27 4
gpt4 key购买 nike

Python 中有没有一种方法可以执行与 UNIX 命令行 tee 等效的操作?我正在执行典型的 fork/exec 模式,我希望子级的标准输出同时出现在日志文件和父级的标准输出中,而不需要任何缓冲。

例如,在此 python 代码中,子级的标准输出最终出现在日志文件中,但不在父级的标准输出中。

pid = os.fork()
logFile = open(path,"w")
if pid == 0:
os.dup2(logFile.fileno(),1)
os.execv(cmd)

编辑:我不想使用子流程模块。我正在用子进程做一些复杂的事情,需要我手动调用 fork

最佳答案

这里你有一个不使用 subprocess 模块的工作解决方案。虽然,您可以将它用于 tee 进程,同时仍然为您的自定义子进程使用 exec* 函数套件(只需使用 stdin=subprocess.PIPE 然后将描述符复制到你的标准输出)。

import os, time, sys

pr, pw = os.pipe()
pid = os.fork()

if pid == 0:
os.close(pw)
os.dup2(pr, sys.stdin.fileno())
os.close(pr)
os.execv('/usr/bin/tee', ['tee', 'log.txt'])
else:
os.close(pr)
os.dup2(pw, sys.stdout.fileno())
os.close(pw)

pid2 = os.fork()

if pid2 == 0:
# Replace with your custom process call
os.execv('/usr/bin/yes', ['yes'])
else:
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
pass

请注意,tee 命令在内部执行与 Ben 在他的回答中建议的相同的事情:读取输入并在写入输出文件描述符时对其进行循环。由于优化的实现并且它是用 C 编写的,它可能更有效,但是你有不同管道的开销(不确定哪个解决方案更有效,但在我看来,重新分配一个自定义文件对象到 stdout 是一个更优雅的解决方案)。

更多资源:

关于Python `tee` 子进程的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6544659/

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