Как открыть программу через python

В скриптах, написанных для автоматизации определенных задач, нам часто требуется запускать внешние программы и контролировать их выполнение. При работе с Python мы можем использовать модуль subprocess для создания подобных скриптов. Этот модуль является частью стандартной библиотеки языка. В данном руководстве мы кратко рассмотрим subprocess и изучим основы его использования.

Прочитав статью, вы узнаете как:

  • Использовать функцию run для запуска внешнего процесса.
  • Получить стандартный вывод процесса и информацию об ошибках.
  • Проверить код возврата процесса и вызвать исключение в случае сбоя.
  • Запустить процесс, используя оболочку в качестве посредника.
  • Установить время ожидания завершения процесса.
  • Использовать класс Popen напрямую для создания конвейера ( pipe ) между двумя процессами.

Так как модуль subprocess почти всегда используют с Linux все примеры будут касаться Ubuntu. Для пользователей Windows советую скачать терминал Ubuntu 18.04 LTS.

Як запустити #python скрипт на #windows

Функция «run»

Функция run была добавлена в модуль subprocess только в относительно последних версиях Python (3.5). Теперь ее использование является рекомендуемым способом создания процессов и должно решать наиболее распространенные задачи. Прежде всего, давайте посмотрим на простейший случай применения функции run .

Предположим, мы хотим запустить команду ls -al ; для этого в оболочке Python нам нужно ввести следующие инструкции:

>>> import subprocess >>> process = subprocess.run([‘ls’, ‘-l’, ‘-a’])

Вывод внешней команды ls отображается на экране:

total 12 drwxr-xr-x 1 cnc cnc 4096 Apr 27 16:21 . drwxr-xr-x 1 root root 4096 Apr 27 15:40 .. -rw——- 1 cnc cnc 2445 May 6 17:43 .bash_history -rw-r—r— 1 cnc cnc 220 Apr 27 15:40 .bash_logout -rw-r—r— 1 cnc cnc 3771 Apr 27 15:40 .bashrc

Здесь мы просто использовали первый обязательный аргумент функции run , который может быть последовательностью, «описывающей» команду и ее аргументы (как в примере), или строкой, которая должна использоваться при запуске с аргументом shell=True (мы рассмотрим последний случай позже).

Захват вывода команды: stdout и stderr

Что, если мы не хотим, чтобы вывод процесса отображался на экране. Вместо этого, нужно чтобы он сохранялся: на него можно было ссылаться после выхода из процесса? В этом случае нам стоит установить для аргумента функции capture_output значение True :

>>> process = subprocess.run([‘ls’, ‘-l’, ‘-a’], capture_output=True)

Как мы можем впоследствии получить вывод ( stdout и stderr ) процесса? Если вы посмотрите на приведенные выше примеры, то увидите, что мы использовали переменную process для ссылки на объект CompletedProcess , возвращаемый функцией run . Этот объект представляет процесс, запущенный функцией, и имеет много полезных свойств. Помимо прочих, stdout и stderr используются для «хранения» соответствующих дескрипторов команды, если, как уже было сказано, для аргумента capture_output установлено значение True . В этом случае, чтобы получить stdout , мы должны использовать:

Уроки Python / Запуск внешних приложений


>>> process = subprocess.run([‘ls’, ‘-l’, ‘-a’], capture_output=True) >>> process.stdout b’total 12ndrwxr-xr-x 1 cnc cnc 4096 Apr 27 16:21 .ndrwxr-xr-x 1 root root 4096 Apr 27 15:40 ..n-rw——- 1 cnc cnc 2445 May 6 17:43 .bash_historyn-rw-r—r— 1 cnc cnc 220 Apr 27 15:40 .bash_logout.

Читайте также:
Декрет о земле был основан на аграрной программе

По умолчанию stdout и stderr представляют собой последовательности байтов. Если мы хотим, чтобы они хранились в виде строк, мы должны установить для аргумента text функции run значение True .

Управление сбоями процесса

Команда, которую мы запускали в предыдущих примерах, была выполнена без ошибок. Однако при написании программы следует принимать во внимание все случаи. Так, что случится, если порожденный процесс даст сбой? По умолчанию ничего «особенного» не происходит. Давайте посмотрим на примере: мы снова запускаем команду ls , пытаясь вывести список содержимого каталога /root, который не доступен для чтения обычным пользователям:

>>> process = subprocess.run([‘ls’, ‘-l’, ‘-a’, ‘/root’])

Как запускать внешние процессы, используя Python

Современные облачные сервисы, например, cloud.timeweb.com , стали сегодня обыденностью. Удалённый доступ и удалённое управление – основа современного цифрового мира. В нашей сегодняшней статье мы расскажем вам, как запускать внешние процессы при помощи различных модулей в Python 3 .

Для запуска внешних программ из Python, а также получения их ввода или вывода используется встроенный модуль subprocess . Данный модуль позволяет запускать и контролировать выполнение различных программ, которые доступны на компьютере.

Чтобы запустить программу с помощью модуля subprocess можно использовать несколько функций: subprocess.run (пришла на замену функции subprocess.call() в версии Python 3.5) и subprocess.Popen.

Синтаксис subprocess.run

subprocess.run(args, *, stdin, input, stdout, stderr,
capture_output, shell, cwd, timeout,
check, encoding, errors, text, env,
universal_newlines)

Аргумент 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 , содержащий результаты работы. С помощью специальных атрибутов можно получить из этого объекта переданные в функцию аргументы, код результата выполнения, вывод или возникшие ошибки. Работая с этой функцией, необходимо аккуратно работать с кодом из ненадёжных источников, потому что она может выполнять всё подряд, особенно в случае запуска от имени администратора.

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

from subprocess import run, Popen, PIPE
from sys import executable
python import local file

Значение executable в Python — это абсолютный путь к исполняемому файлу интерпретатора Python. Оно потребуется для запуска кода.

Рассмотрим простой пример применения CompletedProcess .

Читайте также:
Порядок расчета производственной программы предприятия

run(«echo ‘Subprocesses are cool!», shell=True)
Subprocesses are cool!

Результатом работы будет объект:

CompletedProcess(args=»echo ‘Subprocesses are cool!», returncode=0)

Здесь мы видим переданные нами аргументы и статус выполнения ( returncode ). Когда статус выполнения равен нулю, это означает, что выполнение завершено успешно.

Рассмотрим сценарий сложнее. В предыдущем примере мы просто запустили внешний процесс и получили ответ, что он успешно выполнен. Но что если мы хотим получить не только статус выполнения, но и какие-то данные вывода? Для этого нам необходимо установить параметр capture_output = True :

run(‘ping localhost’, shell = True, capture_output = True, encoding=’cp866′)

В этом примере мы отправляем запрос на localhost для проверки соединения. Параметр encoding указывает, что нам нужно декодировать результат, иначе мы получим его как байтовую строку.

Чтобы получить вывод программы и ошибки, выполним:

print(«stdout:», result.stdout)
print(«stderr:», result.stderr)

stdout:
Обмен пакетами с DESKTOP-*** [::1] с 32 байтами данных:
Ответ от ::1: времяОтвет от ::1: времяОтвет от ::1: времяОтвет от ::1: время
stderr:

В случае, если во время выполнения возникла какая-то ошибка, подпроцесс вернет ее в result.stderr . В данном случае ошибок не возникло.

Обработка исключений

Выполним следующий код:

run([executable, «-c», «raise ValueError(‘It seems there is a mistake!’)»], capture_output=True, encoding=’cp866′)

Элемент -c – это опция командной строки python, позволяющая передавать на ввод целую программу.

Он сработает без проблем, однако если мы захотим вывести stdout , то увидим, что он пустой (в отличие от stderr ).

stdout:
stderr: Traceback (most recent call last):
File «», line 1, in
ValueError: It seems there is a mistake!

Если вызвать метод check_returncode , то мы увидим следующее:

CalledProcessError: Command ‘[‘D:\***\python.exe’, ‘-c’, «raise ValueError(‘It seems there is a mistake!’)»]’ returned non-zero exit status 1.

Как использовать субпроцесс для запуска внешних программ в Python 3

Как использовать субпроцесс для запуска внешних программ в Python 3

Python 3 включает модуль subprocess для запуска внешних программ и чтения их выводов в коде Python.

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

subprocess содержит несколько классов и функций, но в этом обучающем модуле мы расскажем об одной из самых полезных функций модуля subprocess : subprocess.run . Мы изучим разные схемы его применения и основные аргументы ключевых слов.

Предварительные требования

Чтобы получить максимум знаний из этого обучающего модуля, рекомендуется иметь небольшое представление о программировании на Python 3. Дополнительную информацию можно найти в следующих обучающих руководствах:

Запуск внешней программы

Теперь вы можете использовать функцию subprocess.run для запуска внешней программы с кода Python. Прежде всего необходимо импортировать в программу модули subprocess и sys :

import subprocess import sys result = subprocess.run([sys.executable, «-c», «print(‘ocean’)»])

Если вы запустите их, вы увидите следующий вывод:

Outputocean

Рассмотрим этот пример:

  • sys.executable — абсолютный путь к исполняемому файлу Python, из которого изначально была запущена ваша программа. Например, sys.executable может быть путем, таким как /usr/local/bin/python .
  • subprocess.run получает список строк, состоящих из компонентов команды, которую мы пытаемся запустить. Поскольку первой строкой мы передаем sys.executable , мы предписываем subprocess.run запустить новую программу Python.
  • Компонент -c — это опция командной строки python , позволяющая передать строку с целой программой Python для исполнения. В нашем случае мы передаем программу, которая распечатывает строку ocean .
Читайте также:
С помощью какого знака производят разделение координат х и у в программе autocad

Вы можете представить каждую запись в списке, отправляемом в subprocess.run , как отделенную пробелом. Например, [sys.executable, «-c», «print(‘ocean’)»] примерно эквивалентно /usr/local/bin/python -c «print(‘ocean’)» . Обратите внимание, что subprocess автоматически заключает в кавычки компоненты команды перед их запуском в операционной системе, так что вы можете передать имя файла с пробелами.

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

Захват вывода внешней программы

Теперь мы можем вызывать внешнюю программу subprocess.run . Далее мы покажем, как захватывать вывод этой программы. Например, этот процесс может быть полезным, если бы мы хотели использовать файлы git ls для вывода всех файлов, хранящихся в системе контроля версий.

Примечание. Для примеров, показанных в этом разделе, требуется версия Python 3.7 или выше. В частности, в версию Python 3.7, выпущенную в июне 2018 г. были добавлены аргументы capture_output и ключевое слово text .

Дополним наш предыдущий пример:

import subprocess import sys result = subprocess.run( [sys.executable, «-c», «print(‘ocean’)»], capture_output=True, text=True ) print(«stdout:», result.stdout) print(«stderr:», result.stderr)

Если запустить этот код, результат будет выглядеть следующим образом:

Outputstdout: ocean stderr:

Этот пример в целом аналогичен рассмотренному в первом разделе, и мы все еще запускаем субпроцесс для печати ocean . Однако теперь мы передаем аргументы ключевых слов capture_output=True и text=True в subprocess.run .

subprocess.run возвращает объект subprocess.CompletedProcess , который привязан к результату . Объект subprocess.CompletedProcess содержит детали о коде выхода внешней программы и ее выводе. Благодаря capture_output=True в result.stdout и result.stderr вносится соответствующий вывод внешней программы. По умолчанию result.stdout и result.stderr привязаны как байты, но аргумент ключевого слова text=True предписывает Python декодировать байты в строки.

В разделе вывода stdout — это ocean (плюс новая строка в конце, где print добавляет явность), и у нас нет stderr .

Рассмотрим пример, где значение stderr не пустое:

import subprocess import sys result = subprocess.run( [sys.executable, «-c», «raise ValueError(‘oops’)»], capture_output=True, text=True ) print(«stdout:», result.stdout) print(«stderr:», result.stderr)

Если запустить этот код, вывод будет выглядеть следующим образом:

Outputstdout: stderr: Traceback (most recent call last): File «», line 1, in ValueError: oops

Этот код запускает субпроцесс Python, который немедленно выдает ошибку ValueError . При просмотре окончательного результата мы не видим ничего в stdout и видим результат Traceback ошибки ValueError в stderr . Это связано с тем, что по умолчанию Python записывает Traceback необработанного исключения в stderr .

Создание исключения при коде ошибки выхода

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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru