【问题标题】:Popen not writing stdout to file [duplicate]Popen不将标准输出写入文件[重复]
【发布时间】:2021-05-04 12:21:46
【问题描述】:

我正在 python 脚本中运行另一个 python 后台进程,并尝试将其标准输出通过管道传输到文件。我在跑步:

with open("log.log", "wb") as out:
    p = subprocess.Popen(["python", "main.py"], stdout=out, bufsize=1)

但是,文件总是空的,而我可以在 shell 中看到 popen 进程的输出就好了。有什么想法吗?

【问题讨论】:

  • 是否要将 main.py 输出保存在 log.log 文件中?
  • 确实是@omides248
  • 这是标准缓冲。 wait 用于进程,它将关闭文件,该文件将输出刷新到磁盘。但是如果可以避免的话,可能根本不要使用Popen;正如subprocess 文档中所建议的那样,尽可能选择run。然后你不需要显式地wait,因为run 负责正确管理Popen 对象并将其关闭。

标签: python


【解决方案1】:

您可以使用 buffering=1 实时写入文件。 python write to file in real time

并使用 w+ 进行追加

test.py:

import subprocess

if __name__ == '__main__':
    
    with open("log.log", "w+", buffering=1) as f:
        p = subprocess.Popen(["python", "main.py"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
        for line in p.stdout:
            f.write(line.decode("utf-8"))

main.py:

import random
import time

if __name__ == '__main__':

    while True:
        print(f"Hello {random.randint(1, 100)}")
        time.sleep(1)

【讨论】:

  • 当第一个参数是列表时,shell=True 是一个错误。奇怪的是,它可以在 Windows 上运行。但这仍然是一个错误和一个非常常见的错误。
  • 让 Python 读取然后写入输出只是效率低下; OP的原始代码更好。
  • 假设 UTF-8 编码会妨碍可移植性;这里没有特别的理由不简单地读写bytes,这也会更有效率。 (但正确的解决方法是两者都不做;参见前面的评论。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2013-03-10
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多