Для захвата вывода команды в subprocess
в реальном времени в Python можно использовать модуль subprocess
вместе с модулем threading
.
Вот пример кода, который демонстрирует, как это можно сделать:
import subprocess import threading def read_output(process): for line in iter(process.stdout.readline, b''): print(line.decode().strip()) def run_command(command): process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) output_thread = threading.Thread(target=read_output, args=(process,)) output_thread.start() process.wait() output_thread.join() # Пример использования command = "ping -c 5 www.google.com" run_command(command)
В этом примере мы определяем две функции: read_output
, которая будет считывать вывод команды построчно, и run_command
, которая выполняет команду и запускает поток для чтения вывода.
Функция read_output
использует цикл for
и функцию iter
для чтения вывода команды построчно. Мы декодируем каждую строку в UTF-8 и выводим ее с помощью функции print
.
Функция run_command
использует subprocess.Popen
для запуска команды и захвата ее вывода. Мы передаем stdout=subprocess.PIPE
для перенаправления вывода на канал, stderr=subprocess.STDOUT
для перенаправления ошибок в стандартный вывод, и shell=True
для выполнения команды через оболочку.
Затем мы создаем поток выполнения read_output
и запускаем его с аргументом process
, который представляет собой объект Popen
, созданный в run_command
. Затем мы ожидаем завершения команды с помощью process.wait()
, и затем присоединяемся к потоку с помощью output_thread.join()
, чтобы дождаться завершения чтения вывода.
Наконец, мы используем функцию run_command
для выполнения команды. В примере мы запускаем команду ping -c 5 www.google.com
, которая отправляет пять ICMP-сообщений на адрес google.com и выводит результаты в реальном времени.
Важно отметить, что при использовании subprocess
и threading
для выполнения команд и чтения их вывода в реальном времени, необходимо быть осторожными с обработкой потоков, чтобы избежать блокировки и гонок данных.