Современные облачные сервисы, например, timeweb.cloud, стали сегодня обыденностью. Удалённый доступ и удалённое управление – основа современного цифрового мира. В нашей сегодняшней статье мы расскажем вам, как запускать внешние процессы при помощи различных модулей в Python 3.
Для запуска внешних программ из Python, а также получения их ввода или вывода используется встроенный модуль subprocess. Данный модуль позволяет запускать и контролировать выполнение различных программ, которые доступны на компьютере.
Чтобы запустить программу с помощью модуля subprocess можно использовать несколько функций: subprocess.run (пришла на замену функции subprocess.call() в версии Python 3.5) и subprocess.Popen.
Облачные серверы
по всему миру с почасовой оплатой.
Синтаксис subprocess.run
Аргумент args – обязательный, через него передается запускаемая программа с аргументами.
Параметры stdin, input, stdout и stderr отвечают за потоки данных, которые передаются в процесс или выходят из него. Здесь stdout — поток вывода (результат работы), stderr — поток ошибок, которые возникли при выполнении. По умолчанию их значения — None.
capture_output — по умолчанию False, отвечает за захват результата работы процесса (вывода).
Параметр shell отвечает за способ передачи в процесс программы и ее аргументов — если они представлены как одна строка, следует указать True. По умолчанию False.
cwd — используется, если требуется указать абсолютный путь к каталогу с запускаемой программой.
timeout — время в секундах, по истечении которого процесс завершится. При этом возникает исключение.
check — если имеет значение True, то вызывает исключение, если во время выполнения возникли ошибки. По умолчанию False.
encoding — отвечает за декодирование вывода.
errors — если указан, то ошибки кодировки будут вызывать исключение.
text, universal_newlines — текстовые режимы для потоков ввода, вывода и ошибок. По умолчанию false.
env — переменные среды для нового процесса.
Функция возвращает объект CompletedProcess, содержащий результаты работы. С помощью специальных атрибутов можно получить из этого объекта переданные в функцию аргументы, код результата выполнения, вывод или возникшие ошибки. Работая с этой функцией, необходимо аккуратно работать с кодом из ненадёжных источников, потому что она может выполнять всё подряд, особенно в случае запуска от имени администратора.
Перед тем как рассматривать примеры, импортируем необходимые модули:
Значение executable в Python — это абсолютный путь к исполняемому файлу интерпретатора Python. Оно потребуется для запуска кода.
Рассмотрим простой пример применения CompletedProcess.
Вывод:
Результатом работы будет объект:
Здесь мы видим переданные нами аргументы и статус выполнения (returncode). Когда статус выполнения равен нулю, это означает, что выполнение завершено успешно.
Рассмотрим сценарий сложнее. В предыдущем примере мы просто запустили внешний процесс и получили ответ, что он успешно выполнен. Но что если мы хотим получить не только статус выполнения, но и какие-то данные вывода? Для этого нам необходимо установить параметр capture_output = True:
В этом примере мы отправляем запрос на localhost для проверки соединения. Параметр encoding указывает, что нам нужно декодировать результат, иначе мы получим его как байтовую строку.
Чтобы получить вывод программы и ошибки, выполним:
В случае, если во время выполнения возникла какая-то ошибка, подпроцесс вернет ее в result.stderr. В данном случае ошибок не возникло.
Обработка исключений
Выполним следующий код:
Элемент -c – это опция командной строки python, позволяющая передавать на ввод целую программу.
Он сработает без проблем, однако если мы захотим вывести stdout, то увидим, что он пустой (в отличие от stderr).
Если вызвать метод check_returncode, то мы увидим следующее:
Мы получили ошибку. Для того, чтобы исключение возникало на этапе выполнения подпроцесса, необходимо указать параметр check = True.
В этом случае код не выполнится, и мы сразу будем знать, что в процессе возникла какая-то проблема.
Ограничение времени выполнения
Мы можем включить ограничение времени выполнения подпроцесса, чтобы программа, которая работает некорректно, не исполнялась бесконечно. Для этого используется параметр timeout:
В случае, если команда выполнилась, мы получим ее вывод:
Если же наша команда не успела закончить выполнение за отведенное время, мы получаем исключение:
С помощью подпроцессов мы также можем запускать установленные программы. Например:
откроет блокнот.
Также мы можем передавать какой-либо ввод используя stdin и параметр input. Выполним код:
В результате мы получим:
Через Input можно передавать не только определенный текст, но и вывод программы.
Функция subprocess.run
Функция run модуля Subprocess является высокоуровневой. Если для нашей задачи требуется бо́льшая гибкость, то можно использовать напрямую класс Popen. Он имеет схожий синтаксис, однако у него есть несколько дополнительных параметров.
Создадим 2 подпроцесса. В первом мы получим содержимое папки, а с помощью второго выполним сортировку. Чтобы использовать вывод результата первого подпроцесса, мы указываем для него stdout=PIPE (это значение, которое можно использовать в качестве аргумента для stdin, stdout или stderr).
Чтобы создать связь между двумя процессами, используется метод communicate().
Результатом работы этого кода будет вывод отсортированных файлов в папке:
Класс Popen имеет также несколько других полезных методов:
poll()— проверяет, завершён ли дочерний процесс. Возвращает либо код выполнения, либо None, если процесс еще выполняется.wait(timeout=None)— ждет завершения дочернего процесса, если указан timeout, то завершается по истечению указанного времени и вызывает исключениеTimeoutExpired.terminate()— останавливает выполнение процесса.
Подготовили для вас выгодные тарифы на облачные серверы
477 ₽/мес
657 ₽/мес
Заключение
В сегодняшней статье мы рассмотрели, как, используя Python, запустить внешние процессы. Это стандартная возможность библиотеки Python, позволяющая запускать внешние программы и осуществлять вывод.
