Как использовать субпроцесс для запуска внешних программ в Python 3
Python 3 включает модуль subprocess для запуска внешних программ и чтения их выводов в коде Python.
Модуль subprocess может оказаться вам полезен, если вы хотите использовать на своем компьютере другую программу из вашего кода Python. Например, вы можете запустить git из своего кода Python для извлечения в ваш проект, отслеживаемый в системе управления версиями git . Поскольку с помощью модуля subprocess можно контролировать любую программу, доступную на вашем компьютере, приведенные здесь примеры применимы к любым внешним программам, которые вы можете запустить из своего кода Python.
subprocess содержит несколько классов и функций, но в этом обучающем модуле мы расскажем об одной из самых полезных функций модуля subprocess : subprocess.run . Мы изучим разные схемы его применения и основные аргументы ключевых слов.
Предварительные требования
Чтобы получить максимум знаний из этого обучающего модуля, рекомендуется иметь небольшое представление о программировании на Python 3. Дополнительную информацию можно найти в следующих обучающих руководствах:
Запуск внешней программы
Теперь вы можете использовать функцию subprocess.run для запуска внешней программы с кода Python. Прежде всего необходимо импортировать в программу модули subprocess и sys :
Если вы запустите их, вы увидите следующий вывод:
Рассмотрим этот пример:
- — абсолютный путь к исполняемому файлу Python, из которого изначально была запущена ваша программа. Например, sys.executable может быть путем, таким как /usr/local/bin/python .
- subprocess.run получает список строк, состоящих из компонентов команды, которую мы пытаемся запустить. Поскольку первой строкой мы передаем sys.executable , мы предписываем subprocess.run запустить новую программу Python.
- Компонент -c — это опция командной строки python , позволяющая передать строку с целой программой Python для исполнения. В нашем случае мы передаем программу, которая распечатывает строку ocean .
Вы можете представить каждую запись в списке, отправляемом в 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 .
Дополним наш предыдущий пример:
Если запустить этот код, результат будет выглядеть следующим образом:
Этот пример в целом аналогичен рассмотренному в первом разделе, и мы все еще запускаем субпроцесс для печати 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 не пустое:
Если запустить этот код, вывод будет выглядеть следующим образом:
Этот код запускает субпроцесс Python, который немедленно выдает ошибку ValueError . При просмотре окончательного результата мы не видим ничего в stdout и видим результат Traceback ошибки ValueError в stderr . Это связано с тем, что по умолчанию Python записывает Traceback необработанного исключения в stderr .
Создание исключения при коде ошибки выхода
Иногда бывает полезно создать исключение, если при выходе из работающей программы выдается код ошибки выхода. Программы, выдающие нулевой код ошибки при выходе считаются успешными, однако при ненулевом коде ошибки выхода считается, что в программе произошла ошибка. Например, данная система может быть полезной, если нам нужно выдавать исключение при запуске файлов git ls в каталоге, не являющемся репозиторием git .
Мы можем использовать аргумент ключевого слова check=True , чтобы subprocess.run выдавал исключение в случае возврата внешней программой ненулевого кода ошибки выхода:
Если запустить этот код, вывод будет выглядеть следующим образом:
Этот вывод показывает, что мы запустили субпроцесс, выдавший ошибку, которая выводится в stderr на нашем терминале. Затем subprocess.run добросовестно выдал ошибку subprocess.CalledProcessError от нашего имени в нашей основной программе Python.
Также модуль subprocess включает метод subprocess.CompletedProcess.check_returncode , который можно использовать с похожим результатом:
Если мы запустим этот код, мы получим:
Поскольку мы не передали check=True в subprocess.run , мы успешно привязали экземпляр subprocess.CompletedProcess к результату , хотя наша программа выполнила выход с ненулевым кодом ошибки. При этом при вызове result.check_returncode() выдается ошибка subprocess.CalledProcessError , поскольку модуль обнаруживает код ошибки выхода для завершенного процесса.
Использование timeout для раннего выхода из программ
subprocess.run имеет аргумент timeout , позволяющий остановить внешнюю программу, если ее выполнение занимает слишком много времени:
Если запустить этот код, результат будет выглядеть следующим образом:
Субпроцесс, который мы попытались запустить, использовал функцию time.sleep для сна в течение 2 секунд. Однако мы передали аргумент с ключевым словом timeout=1 в subprocess.run , чтобы закрыть наш субпроцесс по таймауту по прошествии 1 секунды. Это объясняет, почему при вызове subprocess.run в конечном итоге было выдано исключение subprocess.TimeoutExpired .
Обратите внимание, что аргумент ключевого слова timeout для subprocess.run является приблизительным. Python постарается остановить субпроцесс после заданного в аргументе timeout количества секунд, но это не обязательно будет точным.
Передача ввода в программы
Иногда программы ожидают передачи ввода через stdin .
Аргумент ключевого слова input для subprocess.run позволяет передавать данные в stdin субпроцесса. Например:
Запустив этот код, мы получим примерно следующий вывод:
В данном случае мы передали байты underwater в input . Наш целевой субпроцесс использовал sys.stdin для чтения переданного в stdin аргумента ( underwater ) и вывел его в результатах.
Аргумент ключевого слова input может быть полезен, если вы хотите создать цепочку из нескольких вызовов subprocess.run с передачей вывода одной программы как ввода в другую программу.
Заключение
Модуль subprocess — это мощный компонент стандартной библиотеки Python, позволяющий легко запускать внешние программы и просматривать их вывод. В этом обучающем модуле вы научились использовать subprocess.run для управления внешними программами, передачи ввода в эти программы, анализа их вывода и проверки возвращаемых ими кодов.
Модуль subprocess представляет дополнительные классы и утилиты, которые мы не охватили в этом обучающем модуле. Изучив основы, вы можете использовать документацию модуля subprocess для получения дополнительной информации о других имеющихся классах и утилитах.
Want to learn more? Join the DigitalOcean Community!
Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.
Запуск других программ из Python
Программа на Python может запускать другие программы с помощью функции Popen() (от process open) встроенного модуля subprocess. В качестве аргумента функция принимает имя программы, которую нужно запустить:
Возвращаемое значение представляет собой объект Popen , имеющий два полезных метода: poll() и wait() .
Метод poll() возвращает значение None , если в момент его вызова процесс все еще выполняется. Если же процесс к этому моменту завершен, то он возвращает код завершения процесса. Код заверешения служит индикатором того, завершился ли процесс без ошибок (код равен нулю) или же его завершение было вызвано ошибкой (ненулевой код).
Метод wait() ожидает завершения запущенного процесса, прежде чем продолжить выполнение основной программы. Возвращаемым значением метода является целочисленный код завершения процесса.
Сначала мы открываем процесс блокнота, затем проверяем, возвращает ли метод poll() значение None . Это означает, что процесс все еще выполняется. После этого закрываем блокнот и еще раз проверяем, возвращает ли метод poll() значение None . Теперь оба метода, wait() и poll() возвращают нулевое значение, что указывает на завершение программы notepad.exe без ошибок.
Передача аргументов командной строки
Процессам, создаваемым с помощью функции Popen() , можно передвать аргументы командной строки. Для этого функции Popen() надо передать список в качестве единственного аргумента. Первой строкой в этом списке должно быть имя исполняемого файла программы, которую надо запустить. Все последующие строки — это аргументы командной строки, которые будут переданы программе при запуске.
Здесь мы не только запускаем приложение notepad.exe , но и открываем файл readme.txt .
Открытие файлов программ по умолчанию
Двойной клик на иконке файла с расширением .txt позволяет автоматически запустить приложение, ассоциированное с этим расширением. Функция Popen() также может открывать файлы подобным образом:
В каждой операционной системе есть программа, выполняющая те же функции, что и двойной клик на иконке файла. В Windows это программа start , в Ubuntu Linux — программа see .
Как запустить из python внешний файл python
Каким образом можно вызвать выполнение другой программы python (из файла .py) во время выполнения текущей?
Можно еще вот так
Наверное вам нужно это:
Лучше вместе с меткой python 3.x указывайте метку python
Но если вторая программа — тоже .py файл, то есть ограничения. Это будет работать, только если в системе установлена ассоциация: запускать .py файлы с помощью интерепретатора, а не открывать их в каком-нибудь текстовом редакторе.
Лучше будет, если ты скомпилируешь .py файл в .exe с помощью pyinstaller (у новичков могут возникнуть трудности при использовании) или cxfreeze (очень удобное управление, но проблемы с тем, чтобы найти этот инструмент и установить). и запустишь уже скомпилированный файл.
PS: компиляция приложений, использующих tkinter, полна нюансов (какие библиотеки положить с .exe — фалом, что установить, прописать и т.п.)
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2022.9.30.30592
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как запустить программу на Python
Основы
Введение в тему
В этом уроке мы ответим на вопрос: как запустить программу на Python? Чтобы ощутить всю мощь языка Пайтон необходимо уметь запускать код, написанный на нём. Программы на Python 3 запускаются независимо от операционной системы, версии языка и местоположения кода. Программа может храниться в файле, среде разработки или редакторе кода.
Где запускать Python скрипты и как
Запустить программу на Python можно несколькими способами:
1. С помощью консоли (командной строки);
2. Использовать конкретную версию Пайтон или Анаконда;
3. Использовать Crontab;
4. Запустить одну программу Пайтон с помощью другого;
5. Использовать файловый менеджер;
6. Используя интерактивный режим Пайтон;
7. Применить редактор кода или IDE.
Запуск Python кода интерактивно
Если открыть консоль и набрать «python3» + «Enter», то запустится Python shell – интерактивный режим исполнения кода Python. Это означает, что в этом режиме Вы можете построчно вводить код и он, так же построчно, будет выполняться. Чаще всего этот режим используют для отладки каких-то небольших частей программы, а также для запуска скриптов, к примеру, управляющих сервером.
Интерактивный режим в Linux
Для запуска кода в интерактивном режиме в Linux достаточно открыть терминал, ввести
$ python и нажать Enter. Готово!
Интерактивный режим в macOS
В macOS всё устроено так же: вводим /$ python и Enter. Интерактивный режим запущен.
Интерактивный режим в Windows
В операционной системе Windows необходимо войти в командную строку и ввести python. После нажатия Enter консоль будет выглядеть следующим образом:
Запуск python скриптов в интерактивном режиме
В интерактивном режиме можно писать код для проверки гипотез, отладки и прочего. Программа будет выполняться построчно.
Символ «>>>» является «приглашением», то есть язык при помощи этого символа приглашает Вас что-то ввести.
Строчки без этого символа в начале – это «вывод». Вывод – это то, что выводит сам язык, его ответ на код, введённый программистом.
Для выхода из интерактивного режима нужно ввести:
Как выполняются python скрипты
Чтобы понять как происходит выполнение Python-скрипта можно рассмотреть следующий пример:
Блок схема выполнения кода интерпретатором
Общая схема выполнения программы выглядит так:
1. Программа или файл с расширением .py компилируется, и из него генерируются байт-коды. Итоговый код имеет расширение .pyc или .pyo.
Файлы с расширением .pyc автоматически создаются интерпретатором при импортировании кода, что оптимизирует будущие импорты этого модуля. Поэтому такие файлы создаются только из .py файлов, если они импортируются другим файлом или модулем с расширением .py.
Файлы .pyo также создается интерпретатором при импорте модуля, но с указанием интерпретатору включения параметров оптимизации.
Оптимизатор активируется добавлением флага «-O» при вызове интерпретатора Python:
python -O
Файлы .pyo меньше по размеру, благодаря алгоритмам оптимизации, применённым интерпретатором.
Тип файла .pyd, в отличие от предыдущих, применим исключительно для ОС Windows. Эти файлы аналогичны подключаемым библиотекам DLL.
2. Генерируется бинарный файл. Он читается интерпретатором для выполнения инструкций.
Опытные разработчики Python иногда читают байт-коды для лучшего понимания работы программы.