подпроцесс всплывает вывод в реальном времени с тайм-аутом - PullRequest
0 голосов
/ 19 февраля 2019

После некоторых исследований я использовал subprocess.check_output (), который принимает параметр timeout и повышает TimeoutExpired, если время ожидания для команды достигнуто.Это нормально, но ограничением является то, что я не получаю вывод в реальном времени, поэтому я вынужден использовать Popen напрямую, в основном:

def execute_cmd(cmd, timeout=2):
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in iter(p.stdout.readline, b''):
        print(line.rstrip().decode("utf-8"))
    p.stdout.close()
    retcode = p.wait()

Как я могу добавить тайм-аут в этот блок кода?

1 Ответ

0 голосов
/ 20 февраля 2019

Я наконец-то нашел решение с таймерами.Не уверен, что это лучший подход, но он работает ..

import os
import signal
import subprocess
import time
from threading import Timer

def execute_bash_cmd(cmd, timeout=5):
    print("cmd: " + cmd)
    def timerout(p):
        print("Command timed out")
        timer.cancel()
        os.killpg(os.getpgid(p.pid), signal.SIGTERM)
        # or use p.kill() if shell==False

    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    timer = Timer(timeout, timerout, args=[p])
    timer.start()
    for line in iter(p.stdout.readline,b''):
        line = line.rstrip().decode("utf-8")
        print(line)
    p.stdout.close()
    retcode = p.wait()
    timer.cancel()

Примеры:

execute_bash_cmd('ls -l /')
execute_bash_cmd('sleep 2', 3)
execute_bash_cmd('sleep 4', 3)

Вывод:

cmd: ls -l /
total 92
drwxr-xr-x   2 root root  4096 Feb 18 15:28 bin
drwxr-xr-x   3 root root  4096 Feb 18 15:16 boot
drwxr-xr-x  20 root root  4020 Feb 18 15:43 dev
drwxr-xr-x 134 root root 12288 Feb 19 22:42 etc
drwxr-xr-x   3 root root  4096 Jun  7  2018 home
drwxr-xr-x   7 root root  4096 Feb 18 15:28 lib
drwxr-xr-x   5 root root  4096 Feb 18 15:28 lib64
drwx------   2 root root 16384 Feb 18 13:12 lost+found
drwxr-xr-x   2 root root  4096 Jun  7  2018 mnt
drwxr-xr-x   3 root root  4096 Feb 18 15:26 opt
dr-xr-xr-x 247 root root     0 Feb 18 15:43 proc
drwx------  10 root root  4096 Feb 19 22:42 root
drwxr-xr-x  37 root root  1060 Feb 19 20:21 run
drwxr-xr-x   2 root root 12288 Feb 18 15:20 sbin
drwxr-xr-x   2 root root  4096 Jun  7  2018 selinux
drwxr-xr-x   5 root root  4096 Feb 18 15:18 srv
dr-xr-xr-x  13 root root     0 Feb 19 22:42 sys
drwxrwxrwt  23 root root  4096 Feb 19 22:37 tmp
drwxr-xr-x  11 root root  4096 Jun  7  2018 usr
drwxr-xr-x  11 root root  4096 Feb 18 14:15 var

cmd: sleep 2

cmd: sleep 4
Command timed out
Terminated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...