Скрыть вывод os.system в Python и сохранить в переменной
Быстрый ответ
Чтобы перехватить вывод команды, не показывая его на экране, вы можете воспользоваться функцией subprocess.run
из модуля subprocess
в Python. Установив параметры capture_output=True
и text=True
, вы без особого труда сумеете получить вывод в виде строки и удалить ненужные пробелы в конце:
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True).stdout.strip()
Мощный инструмент subprocess.Popen
subprocess.Popen
представляет собой универсальное решение для работы с подпроцессами. Он умеет выполнять широкий спектр задач, начиная от запуска сложных команд до перехвата вывода и обработки ошибок.
import subprocess
with subprocess.Popen('your_command', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) as proc:
stdout, stderr = proc.communicate()
# Отныне в переменной stdout хранится результат выполнения команды, stderr – информация об ошибках, если таковые возникали.
Вопреки всей его функциональности, subprocess.Popen
предлагает больших возможностей по сравнению с простым os.popen('command').read()
.
Функция subprocess.run и объект CompletedProcess
Если вы используете Python версии 3.5 или поздней, вся работа с подпроцессами может быть выполнена с помощью subprocess.run
:
result = subprocess.run(['your_command'], capture_output=True, text=True)
output = result.stdout
В результате такого вызова мы получим объект CompletedProcess
, сделавший доступ к результатам выполнения команды более простым.
Обработка ошибок и создание вспомогательных функций
Также важно быть на дистанции с возникающими ошибками при работе с подпроцессами. Использование параметра check=True
позволяет процессу исключения CalledProcessError
уведомить вас, если команда завершилась с ошибкой:
def run_command(command):
result = subprocess.run(command, capture_output=True, text=True, check=True)
return result.stdout.strip()
Таким образом, вы сможете с гораздо большим удобством использовать функцию, заботящуюся о перехвате вывода команды.
Сокровищница возможностей subprocess
В модуле subprocess
скрыт целый набор полезных функций. Например, параметр universal_newlines=True
упрощает обработку вывода команд. Советуем ознакомиться с документацией по модулю subprocess
из Python, чтобы узнать больше.
Визуализация
Представьте себя шпионом, чьей задачей является перехват важного сообщения, умело маскируя свои действия.
Код для такого случая может выглядеть следующим образом:
import subprocess
secret_info = subprocess.check_output(['command', 'arg1', 'arg2'], stderr=subprocess.STDOUT)
А вот, какой результат это даст:
До: Вывод команды виден всем (ничего не скрыто)
После: Вывод команды перехвачен и скрыт (в тишине – сила)
Управление ограничениями и потенциальными сложностями
При использовании subprocess
необходимо быть в курсе некоторых тонкостей:
- Обработка ошибок: Конечно важно следить за кодами возврата и ошибками, чтобы минимизировать вероятность возникновения неприятных ситуаций.
- Инъекции командной оболочки: Использование параметра
shell=True
повышает риск атак на ваши данные. - Производительность: Запуск подпроцессов может негативно сказаться на производительности из-за дополнительных накладных расходов.
Применяя лучшие практики и учитывая потенциальные уязвимости, вы сможете значительно минимизировать данные риски.
Специфика различных платформ
Не все команды и их синтаксис универсальны. Несмотря на то что subprocess
совместим с различными платформами, несомненно стоит убедиться, что ваши команды совместимы с операционной системой, на которой вы работаете.
Полезные материалы
- subprocess — Управление подпроцессами — Документация по Python 3.12.1
- python – Чем отличается subprocess.Popen от os.system – Stack Overflow
- Как приступить к выполнению ваших скриптов и кода на Python – Real Python
- Модуль OS в Python – PythonForBeginners.com
- Как подавить вывод в IPython, работающим в Jupyter? – Stack Overflow
- Управление подпроцессами – Python Wiki