Я пытаюсь интегрировать python-скрипт ESA'2 sen2cor в мой рабочий процесс. Для этого я создаю подпроцесс, с помощью которого я вызываю файл «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;
Я пробовалубить подпроцесс без флага создания, который я использовал в приведенном выше примере: это приводит к уничтожению подпроцесса, но скрипт «L2A_Process.py» обнаруживает, что он продолжает работать (что является ядром моей проблемы);
- Я не могу использовать CTRL_C_EVENT, поскольку хочу перезапустить сбойный «L2A_Process.py» в цикле, пока он не завершится успешно.