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

杀死由另一个脚本(Windows)调用的子进程启动的python脚本,python,subprocess,Python,Subprocess,我正在尝试将ESA的SEN2或python脚本集成到我的工作流中。为此,我创建了一个子流程,用它调用“L2A_Process.bat”文件,该文件反过来调用“L2A_Process.py”脚本。 我希望启动sen2cor脚本时有一个超时,因为它会不时被卡住和冻结,以便在失败时自动重新启动它。 为了启动它并捕获超时,我成功地使用了以下脚本: import os, subprocess from signal import CTRL_BREAK_EVENT timeout = 3600 #1hou

我正在尝试将ESA的SEN2或python脚本集成到我的工作流中。为此,我创建了一个子流程,用它调用“L2A_Process.bat”文件,该文件反过来调用“L2A_Process.py”脚本。 我希望启动sen2cor脚本时有一个超时,因为它会不时被卡住和冻结,以便在失败时自动重新启动它。 为了启动它并捕获超时,我成功地使用了以下脚本:

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)
我想知道如何正确地终止子流程“p”及其所有子流程(即“L2A_Process.py”)

一些意见:

  • 此脚本需要在Windows上运行

  • 我尝试在没有上面示例中使用的creationflag的情况下终止子流程:这会导致终止子流程,但“L2A_Process.py”脚本会终止并保持运行(这是我问题的核心)

  • 我不能使用CTRL\u C\u事件,因为我想在循环中重新启动失败的“L2A\u Process.py”,直到它成功

此代码用于我在将Sentinel 2数据的L1C转换为L2A时监视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()