从subprocess.Popen安全地将stdout重定向到文件

时间:2017-03-20 10:20:57

标签: python file service subprocess stdout

我有一个python服务,它使用subprocess.Popen运行某些程序并将stdout / stderr记录到文件中。它基于答案here很好地工作。

由于它作为服务运行,我想确保正确完成清理。代码的结构类似于:

while RunningService:
    try:
        command = "some command to run the program with arguments"

        with open('out-file.txt', 'a') as f_out:
            myProc = subprocess.Popen(command, stdout=f_out, stderr=f_out)

        # some looping/waiting
        # ...
        # ...

        if breakCondition:
            break

    except Exception as e:
        # do some error logging for the caught exception
    finally:
        myProc.kill()

我想要了解的是当我们终止进程时文件句柄f_out会发生什么。文件什么时候关闭?如果我在另一个函数中创建了Popen对象并返回它会不同呢?

1 个答案:

答案 0 :(得分:0)

首先,这是错误的:

myProc = subprocess.Popen(command, stdout=f_out, stderr=f_out)

您不应对f_outstdout使用stderr,而应使用

myProc = subprocess.Popen(command, stdout=f_out, stderr=subprocess.STDOUT)

然后,要小心:如果您的进程在with块之外执行,它可能会尝试写入已关闭的文件,并且您将获得异常。

必须在with块内终止该过程。使用myProc.wait()(阻止)或myProc.poll() is not None(非阻止)杀死它或等待完成