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

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

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

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

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

process = subprocess.Popen(["команда", "аргумент"], stdout=subprocess.PIPE)
output = process.communicate()[0].decode()

Пошаговый план для смены профессии

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

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

Обработка ошибок в процессах должна быть прямолинейной, такой же, как заказ напитка в 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](https://docs.python.org/3/library/subprocess.html)
2. [Подробное руководство по работе с подпроцессами в Python](https://pymotw.com/3/subprocess/index.html)
3. [Как преобразовать байты в строки в Python 3](https://stackoverflow.com/questions/606191/convert-bytes-to-a-string-in-python-3)
4. [Лёгкое выполнение команд оболочки](https://stackoverflow.com/questions/89228/how-do-i-execute-a-program-or-call-a-system-command)
5. [Примеры использования subprocess в Python](https://www.programcreek.com/python/example/50/subprocess.check_output)
6. [Работа с командами оболочки как профессионал Python](https://janakiev.com/blog/python-shell-commands/)

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой модуль в Python используется для выполнения команд в подсистеме?
1 / 5

Загрузка...