杀死由另一个脚本(Windows)调用的子进程启动的python脚本



我正在尝试将ESA'2 sen2cor python脚本集成到我的工作流程中。为此,我创建了一个子进程,使用该子进程调用"L2A_Process.bat"文件,该文件又调用"L2A_Process.py"脚本。 我想在超时的情况下启动 sen2cor-script,因为它会不时卡住并冻结,以便在失败时自动重新启动它。 为了启动它并捕获超时,我成功使用以下脚本:

import os, subprocess
from signal import CTRL_BREAK_EVENT
timeout = 3600 #1hour
l1c_safe_path = "path/to/my/input/file.SAFE" #product that I want to process
command = ["L2A_process.bat", l1c_safe_path]
p = subprocess.Popen(command,shell=False, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
try:    
p.wait(timeout)
except subprocess.TimeoutExpired:    
os.kill(p.pid, CTRL_BREAK_EVENT) 

这是我所得到的。它导致 sen2cor 脚本暂停,给出以下输出:

Terminate batch job (Y/N)

我想知道如何用它自己的所有子进程(即"L2A_Process.py"(正确终止我的子进程"p"。

一些观察:

  • 此脚本需要在 Windows 上运行;

  • 我试图在没有我在上面的例子中使用的 creationflag 的情况下杀死子进程:这会导致子进程被杀死,但"L2A_Process.py"脚本取消教导继续运行(这是我问题的核心(;

  • 我无法使用CTRL_C_EVENT,因为我想在循环中重新启动失败的"L2A_Process.py",直到它成功。

这段代码适用于我在将 L2C 转换为 L2A 以获取哨兵 2 数据时监控 Sen2cor 状态。Sen2cor 进程耗费时间和 CPU,因此请耐心等待。用 DEM、DDV 等创建 L2A 花了半个小时。希望对你有帮助

from subprocess import Popen, PIPE 
import os
pathtoprodS1C = "path_to_L1C_product"   // safe file 
outdirS2A = "output_dir"                // where L2A files will be placed  
pathtoL2Process = "path_to_L2A_Process" //if not in path
pathtoGIPP = "path_to_your_GIPP/L2A_GIPP.xml"
procName = "./L2A_Process"
os.chdir(pathtoL2Process)
import shlex
pcall = "./{} {} --output_dir {} --tif --GIP_L2A {}".format(procName, 
pathtoprodS1C, 
pathtoprodS2A,
pathtoGIPP)
args = shlex.split(pcall)
print(args)
try:
p = Popen(args, stdout=PIPE)
eut = p.stdout.readline()
while eut:
eut = p.stdout.readline()
print(eut)
finally:
print('Sen2Cor is Done')

exit()

最新更新