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/