Вот что я написал как сторожевой таймер для выполнения подпроцесса.Я использую его сейчас очень часто, но у меня нет такого опыта, поэтому, возможно, в нем есть некоторые недостатки:
import subprocess
import time
def subprocess_execute(command, time_out=60):
"""executing the command with a watchdog"""
# launching the command
c = subprocess.Popen(command)
# now waiting for the command to complete
t = 0
while t < time_out and c.poll() is None:
time.sleep(1) # (comment 1)
t += 1
# there are two possibilities for the while to have stopped:
if c.poll() is None:
# in the case the process did not complete, we kill it
c.terminate()
# and fill the return code with some error value
returncode = -1 # (comment 2)
else:
# in the case the process completed normally
returncode = c.poll()
return returncode
Использование:
return = subprocess_execute(['java', '-jar', 'some.jar'])
Комментарии:
- здесь время ожидания в секундах;но это легко изменить на все, что нужно, изменив значение
time.sleep()
.time_out
должен быть соответствующим образом задокументирован; - в зависимости от того, что необходимо, здесь может быть более целесообразно выдвинуть какое-то исключение.
Документация: Я немного боролся сдокументация модуля subprocess
для понимания того, что subprocess.Popen
не блокирует;процесс выполняется параллельно (возможно, я не использую правильное слово здесь, но я думаю, что это понятно).
Но поскольку то, что я написал, является линейным по своему исполнению, мне действительно нужно ждать, пока командазавершено, с тайм-аутом, чтобы избежать ошибок в команде, чтобы приостановить ночное выполнение скрипта.