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

标签 python file-io

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/

相关文章:

javascript - 用于 JavaScript 生成的 URL 的 Python Web 爬虫

python - (numpy)随机种子有范围吗?

java读取加密对象

python - RabbitMQ 消费者连接在空闲 90 秒后终止

python - 在 python 中找到阶乘的最佳方法?

python - 如何等待python中动态启动的多个线程完成

安卓文件IO

java - 使用Java 7 nio读写文件

C++ - 访问可执行文件上的 "dropped"文件

java - 如何在 Java 中删除目录内容?