Как сохранить вывод subprocess.Popen в строку Python
Быстрый ответ
Для перехвата результата выполнения команды в Python, воспользуясь subprocess.Popen
, необходимо выполнить следующие шаги:
import subprocess
process = subprocess.Popen(["команда", "аргумент"], stdout=subprocess.PIPE)
output = process.communicate()[0].decode()

Более детальное перехватывание вывода: исключения и обработка ошибок
Мастерство в обработке ошибок
Обработка ошибок в процессах должна быть прямолинейной, такой же, как заказ напитка в Starbucks:
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)}")
Визуализация
Предположим, вы находитесь на концерте и хотите записать аплодисменты:
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/)