Как сохранить вывод subprocess.Popen в строку Python
Пройдите тест, узнайте какой профессии подходите
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы
Быстрый ответ
Для перехвата результата выполнения команды в 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
аналогично нажатию кнопки "запись":
---------------------------
| Концерт (Вывод) |
| 🎙 => 📼 (Запись) |
---------------------------
| Запись: "Браво!\n" |
---------------------------
Советы и уловки: аргументы команд, безопасность и многое другое
Правильное формирование аргументов команды
Использование списка, а не строки, для передачи команды и её аргументов помогает предотвратить атаки через инъекции кода:
command = ["brew", "coffee"]
process = subprocess.Popen(command, stdout=subprocess.PIPE)
output = process.communicate()[0].decode("utf-8")
Контроль выполнения команд
Гарантия надёжного выполнения команды
Мы работаем с тайм-аутами и интерактивными командами, и это гораздо интереснее, чем огурцы в остром соусе:
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()