Параметр cwd задает текущую папку для нового процесса.
Если вы запускаете приложение при подключенных сокетах и не хотите что-б они передавались в дочерний процесс то нужно указать флаг close_fds = True
Запуск программы без ожидания её завершения
import subprocess cmd = ‘ping google.com’ subprocess.Popen(cmd, shell = True)
Полезные методы работы с процессом
p = subprocess.Popen(cmd, shell = True) p.poll() # проверяет завершился ли процесс, если процесс ещё работает, то poll() == None, иначе вернет код завершения p.wait() # ожидает завершения процесса ( блокирующая функция )
см. Убить дерево процессов
Источник: py-my.ru
Программирование на языке Python. Запуск внешних приложений из программы на Python (subprocess)
Все ссылки на статьи и ролики моего канала Old Programmer : Программирование. Тематическое оглавление моего Zen-канала (Old Programmer) . См. также мои материалы по Python . А здесь о разных библиотеках Python3.
Уроки Python / Запуск внешних приложений
Совсем маленький вопрос, но очень важный: запуск внешних программ из программы на Python . Очень полезное дело в программировании. Мы предлагаем самый универсальный, рекомендуемый python-программистами подход.
Используем модуль subprocess на Python для запуска внешних процессов
Для запуска используется модуль subprocess . Мы с ним уже встречались. Удобство этого модуля заключается в том, что мы можем при желании получить консольный вывод запускаемой программы. Т.е. имеем, можно сказать, такой канал обратной связи. Простая программа ex4000.py демонстрирует это.
В случае, если запускаемая программа выводит что-то на консоль, то запускающая программа принимает это и сама печатает на консоли, если запускаемая программа ничего не выводит, то запуск осуществляется, но вывод на консоль не происходит. Для запуска в командной строке следует указать запускаемую программу, указав в строке в кавычках, при необходимости, путь и параметры через пробелы. Например
./ex40000.py «ls / -al»
./ex4000.py «./run»
./ex4000.py «ps -A»
Конечно, пример представленный в сегодняшней статье это ничто иное, как создание процесса, т.е. пример многозадачности в чистом виде. Просто мы заострили внимание именно на запуске внешних программ.
Пока, осваиваем Python и подписываемся на мой канал Old Programmer о программировании и программистах.
Я вижу, что вы забыли поставить LIKE, не так ли?
Источник: dzen.ru
Как запустить программу через python
- XpresServers
- Blog
- blog
- Как использовать субпроцесс для запуска внешних программ в Python 3
Запуск внешних приложений с помощью python
Как использовать субпроцесс для запуска внешних программ в Python 3
Автор выбрал COVID-19 Relief Fund для получения пожертвования в рамках программы Write for DOnations.
Введение
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’)»])
Если вы запустите их, вы увидите следующий вывод:
Output
ocean
Рассмотрим этот пример:
- sys.executable — абсолютный путь к исполняемому файлу 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 .
Дополним наш предыдущий пример:
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)
Если запустить этот код, результат будет выглядеть следующим образом:
Output
stdout: 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)
Если запустить этот код, вывод будет выглядеть следующим образом:
Output
stdout: stderr: Traceback (most recent call last): File «», line 1, in ValueError: oops
Этот код запускает субпроцесс Python, который немедленно выдает ошибку ValueError . При просмотре окончательного результата мы не видим ничего в stdout и видим результат Traceback ошибки ValueError в stderr . Это связано с тем, что по умолчанию Python записывает Traceback необработанного исключения в stderr .
Создание исключения при коде ошибки выхода
Иногда бывает полезно создать исключение, если при выходе из работающей программы выдается код ошибки выхода. Программы, выдающие нулевой код ошибки при выходе считаются успешными, однако при ненулевом коде ошибки выхода считается, что в программе произошла ошибка. Например, данная система может быть полезной, если нам нужно выдавать исключение при запуске файлов git ls в каталоге, не являющемся репозиторием git .