我有一个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对象并返回它会不同呢?
答案 0 :(得分:0)
首先,这是错误的:
myProc = subprocess.Popen(command, stdout=f_out, stderr=f_out)
您不应对f_out
和stdout
使用stderr
,而应使用
myProc = subprocess.Popen(command, stdout=f_out, stderr=subprocess.STDOUT)
然后,要小心:如果您的进程在with
块之外执行,它可能会尝试写入已关闭的文件,并且您将获得异常。
必须在with
块内终止该过程。使用myProc.wait()
(阻止)或myProc.poll() is not None
(非阻止)杀死它或等待完成