Как сохранить вывод subprocess.Popen в строку Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для перехвата результата выполнения команды в Python, воспользуясь subprocess.Popen, необходимо выполнить следующие шаги:

Python
Скопировать код
import subprocess

process = subprocess.Popen(["команда", "аргумент"], stdout=subprocess.PIPE)
output = process.communicate()[0].decode()
Кинга Идем в IT: пошаговый план для смены профессии

Более детальное перехватывание вывода: исключения и обработка ошибок

Мастерство в обработке ошибок

Обработка ошибок в процессах должна быть прямолинейной, такой же, как заказ напитка в Starbucks:

Python
Скопировать код
try:
  process = subprocess.Popen(["brew"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  output, error = process.communicate()

  if process.returncode != 0:
    print(f"Процесс завершился с ошибкой: {error.decode()} 😞")
  else:
    print(f"Процесс завершился успешно: {output.decode()} ☕️")
except Exception as e:
  print(f"Произошла ошибка: {str(e)}")

Визуализация

Предположим, вы находитесь на концерте и хотите записать аплодисменты:

Python
Скопировать код
import subprocess

performance = subprocess.Popen(['echo', 'Браво!'], stdout=subprocess.PIPE)
recording, _ = performance.communicate()

Использование Popen аналогично нажатию кнопки "запись":

Markdown
Скопировать код
---------------------------
|  Концерт (Вывод)        |
|  🎙  => 📼 (Запись)      |
---------------------------
|  Запись: "Браво!\n"     |
---------------------------

Советы и уловки: аргументы команд, безопасность и многое другое

Правильное формирование аргументов команды

Использование списка, а не строки, для передачи команды и её аргументов помогает предотвратить атаки через инъекции кода:

Python
Скопировать код
command = ["brew", "coffee"]
process = subprocess.Popen(command, stdout=subprocess.PIPE)
output = process.communicate()[0].decode("utf-8")

Контроль выполнения команд

Гарантия надёжного выполнения команды

Мы работаем с тайм-аутами и интерактивными командами, и это гораздо интереснее, чем огурцы в остром соусе:

Python
Скопировать код
process = subprocess.Popen([r"/path/to/cool/command"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

try:
  output, _ = process.communicate(b'введите данные для обработки\n', timeout=9)
except subprocess.TimeoutExpired:
  process.kill()
  output, _ = process.communicate()

Полезные материалы

  1. Документация модуля subprocess
  2. Подробное руководство по работе с подпроцессами в Python
  3. Как преобразовать байты в строки в Python 3
  4. Лёгкое выполнение команд оболочки
  5. Примеры использования subprocess в Python
  6. Работа с командами оболочки как профессионал Python