子进程在后台运行,并将输出内容逐行写入文件

时间:2019-02-08 19:12:00

标签: python file subprocess pipe

我有两个文件:

main.py

import subprocess
import shlex


def main():
    command = 'python test_output.py'
    logfile =  open('output', 'w')
    proc = subprocess.Popen(shlex.split(command), stdout=logfile)


if __name__ == "__main__":
    main()

test_output.py

from time import sleep
import os

for i in range(0, 30):
    print("Slept for => ", i+1, "s")
    sleep(1)
os.system("notify-send completed -t 1500")

子进程完成后,该过程的输出将写入logfile中。有什么办法可以做到:

  1. 从main开始子进程并退出它(就像现在一样)。
  2. 继续在后台运行子进程。
  3. 当子进程产生输出时,请立即将其写入logfile。 (不要像现在那样等待子进程完成。)

还有其他问题(like this one)给出了逐行读取的解决方案,但它们使main.py等待。是否可以在后台执行所有操作而无需等待main.py等待?

1 个答案:

答案 0 :(得分:0)

文件处理程序的两个缓冲区(作为子进程)都可以设置为“行缓冲”,其中换行符导致转发每个对象的缓冲区。这是通过将buffer参数设置为1来完成的,请参见open()命令和subprocess

您需要确保子进程不会自行缓冲。通过查看您是否也在运行Python脚本,您要么需要在其中的代码中实现此功能,例如对于print语句使用flush = True:

print(this_and_that, flush=True)

Source

Credit