Скрыть вывод os.system в Python и сохранить в переменной

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

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

Чтобы перехватить вывод команды, не показывая его на экране, вы можете воспользоваться функцией subprocess.run из модуля subprocess в Python. Установив параметры capture_output=True и text=True, вы без особого труда сумеете получить вывод в виде строки и удалить ненужные пробелы в конце:

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

result = subprocess.run(['ls', '-l'], capture_output=True, text=True).stdout.strip()
Кинга Идем в IT: пошаговый план для смены профессии

Мощный инструмент subprocess.Popen

subprocess.Popen представляет собой универсальное решение для работы с подпроцессами. Он умеет выполнять широкий спектр задач, начиная от запуска сложных команд до перехвата вывода и обработки ошибок.

Python
Скопировать код
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:

Python
Скопировать код
result = subprocess.run(['your_command'], capture_output=True, text=True)
output = result.stdout

В результате такого вызова мы получим объект CompletedProcess, сделавший доступ к результатам выполнения команды более простым.

Обработка ошибок и создание вспомогательных функций

Также важно быть на дистанции с возникающими ошибками при работе с подпроцессами. Использование параметра check=True позволяет процессу исключения CalledProcessError уведомить вас, если команда завершилась с ошибкой:

Python
Скопировать код
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, чтобы узнать больше.

Визуализация

Представьте себя шпионом, чьей задачей является перехват важного сообщения, умело маскируя свои действия.

Код для такого случая может выглядеть следующим образом:

Python
Скопировать код
import subprocess
secret_info = subprocess.check_output(['command', 'arg1', 'arg2'], stderr=subprocess.STDOUT)

А вот, какой результат это даст:

Markdown
Скопировать код
До: Вывод команды виден всем (ничего не скрыто)
После: Вывод команды перехвачен и скрыт (в тишине – сила)

Управление ограничениями и потенциальными сложностями

При использовании subprocess необходимо быть в курсе некоторых тонкостей:

  1. Обработка ошибок: Конечно важно следить за кодами возврата и ошибками, чтобы минимизировать вероятность возникновения неприятных ситуаций.
  2. Инъекции командной оболочки: Использование параметра shell=True повышает риск атак на ваши данные.
  3. Производительность: Запуск подпроцессов может негативно сказаться на производительности из-за дополнительных накладных расходов.

Применяя лучшие практики и учитывая потенциальные уязвимости, вы сможете значительно минимизировать данные риски.

Специфика различных платформ

Не все команды и их синтаксис универсальны. Несмотря на то что subprocess совместим с различными платформами, несомненно стоит убедиться, что ваши команды совместимы с операционной системой, на которой вы работаете.

Полезные материалы

  1. subprocess — Управление подпроцессами — Документация по Python 3.12.1
  2. python – Чем отличается subprocess.Popen от os.system – Stack Overflow
  3. Как приступить к выполнению ваших скриптов и кода на Python – Real Python
  4. Модуль OS в Python – PythonForBeginners.com
  5. Как подавить вывод в IPython, работающим в Jupyter? – Stack Overflow
  6. Управление подпроцессами – Python Wiki