Выполнение popen с тайм-аутом - PullRequest
0 голосов
/ 31 августа 2018

Поэтому я пытаюсь выполнить команду Linux специально через subprocess.popen(). Я хочу подождать только 30 секунд для выполнения этой команды, потому что в определенных сценариях моя команда зависает, а программа ожидает навсегда. Ниже приведены два подхода, которые я использовал.

Подход 1

cmd = "google-chrome  --headless  --timeout=30000  --ignore-certificate-errors --print-to-pdf out.pdf https://www.google.com/
process = subprocess.call(cmd, shell=True)
process.wait() # Here I want to wait only till 30 secs and not untill process completes

Подход 2

from multiprocessing import Process
p1 = Process(target=subprocess.call, args=(cmd,))
        processTimeout = 50
        p1.start()
        p1.join(processTimeout)
        if p1.is_alive():
            p1.terminate()

Во 2-м подходе файл даже не создается. Пожалуйста, предложите вариант.

1 Ответ

0 голосов
/ 31 августа 2018

Popen.wait принимает необязательный параметр timeout. Вы используете это, чтобы ждать завершения только в течение определенного времени. Если тайм-аут срабатывает, вы можете прервать процесс.

process = subprocess.call(cmd)
try:
    # if this returns, the process completed
    process.wait(timeout=30)
except subprocess.TimeoutExpired:
    process.terminate()

Начиная с Python 3.5, вы также можете использовать вспомогательную функцию subprocess.run.

subprocess.run(cmd, timeout=30)

Обратите внимание, что это все равно вызовет TimeoutExpired, но автоматически завершит подпроцесс.

...