Скрыть вывод 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


