如何在终止子进程之前关闭子进程中的文件?

时间:2018-03-09 00:23:44

标签: python subprocess

我想创建一个不断添加" test"的子进程(writer.py)。每秒到一个文件(' 20180309.txt')并使用另一个python进程(starter.py)维护子进程。

它运行正常,但令我困扰的一件事是the file object在终止子进程之前没有关闭。我想知道当子进程收到terminate()信号时,是否有办法关闭文件对象,或者是否有其他方法可以解决这个问题。

#starter.py
import os
import sys
import subprocess

p1 = subprocess.Popen( ["d:\python36-32\python.exe", r"""writer.py"""], shell=False )
print(p1.pid)

try:
    p1.communicate(timeout=5)
except subprocess.TimeoutExpired:
    p1.terminate()




#writer.py
import time
from datetime import datetime

file = open( datetime.now().strftime('%Y-%m-%d') + '.txt', 'a')

while True:
    file.write('test\n')
    file.flush()
    time.sleep(1)

1 个答案:

答案 0 :(得分:1)

首先,任何现代操作系统都会关闭进程在其消失时打开的所有(非共享)文件。你不必担心这个。

在一个更复杂的应用程序中,您可能需要担心部分写入(或任何其他"事务的部分"无法原子地完成),但对于简单的情况,那里有&#39什么都不用担心。

同时,terminate中的subprocess方法不适用于礼貌关闭请求。如果您想关闭孩子,可以通过更好的方式向其发送消息。事实上,由于孩子和父母都是Python,你可能会更乐意使用multiprocessing而不是subprocess

话虽如此,在* nix上,terminate恰好发送SIGTERMSIGTERM 设计用于礼貌关闭。如果您真的想要处理这个 - 并且不关心Windows - 请阅读signal库,了解如何为SIGTERM编写信号处理程序。从信号处理程序中,您可以在下一次循环中设置全局"退出"变量。或者致电sys.exit(我认为这会在顶级代码中引发异常,但不要引用我的内容)或其他任何你想要的内容。