Как получить вывод из подпроцесса Python - PullRequest
0 голосов
/ 11 октября 2019

Я использую функцию подпроцесса Python, потому что хочу прочитать вывод команды в реальном времени.

Но я бы хотел, чтобы после окончания процесса все, что было написано каквывод потока был полностью возвращен объекту.

import subprocess
import shlex

def run_command(command):
    process = subprocess.Popen(str.split(command), stdout=subprocess.PIPE, stderr = subprocess.PIPE, encoding="utf-8", shell=True)
    while True:
        output = process.stdout.readline()
        if output == '' and process.poll() is not None:
            break
        if output:
            print(output.strip())
    out, err = process.communicate()
    return (process.returncode, out, err)

command_output = run_command("ping 8.8.8.8")
print(command_output)

Фактический результат:

Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=12ms TTL=57
Reply from 8.8.8.8: bytes=32 time=15ms TTL=57
Reply from 8.8.8.8: bytes=32 time=15ms TTL=57
Reply from 8.8.8.8: bytes=32 time=16ms TTL=57

Ping statistics for 8.8.8.8:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 12ms, Maximum = 16ms, Average = 14ms
(0, '', '')

Я только получаю статус кода завершенного процесса. Стандартный вывод пустой, но должен содержать весь вывод обработанной команды.

Я использую Python 3.7.4

Я не знаю, что с этим делать.

1 Ответ

0 голосов
/ 11 октября 2019

Вы не можете читать из канала несколько раз, поэтому вызов process.communicate() после того, как это сделано, не позволит вам снова прочитать stdout.

Вы должны просто все выходные данные, которые вы прочитали встрока.

def run_command(command):
    process = subprocess.Popen(str.split(command), stdout=subprocess.PIPE, stderr = subprocess.PIPE, encoding="utf-8", shell=True)
    all_output = ''
    while True:
        output = process.stdout.readline()
        if output == '' and process.poll() is not None:
            break
        if output:
            all_output += output
            print(output.strip())
    out, err = process.communicate()
    return (process.returncode, all_output, err)
...