Как запустить программу через другую программу питон

Содержание

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

subprocess.call([r’C:pathtoapp.exe’, ‘arg1’, ‘—flag’, ‘arg’])

Для команд оболочки, установленной shell=True и обеспечить команду в виде строки , а не списка.

subprocess.call(‘echo «Hello, world»‘, shell=True)

Обратите внимание , что две команды выше возврата только exit status подпроцесса. Кроме того, обратите внимание при использовании shell=True , так как она обеспечивает проблемы безопасности (см здесь ).

Если вы хотите , чтобы иметь возможность получить стандартный вывод подпроцесса, то подставим subprocess.call с subprocess.check_output .Для более опытных пользователей, обратитесь к этим .

Больше гибкости с Popen

Использование subprocess.Popen дает более мелкозернистую контроль над запущенными процессами , чем subprocess.call .

Запуск подпроцесса

process = subprocess.Popen([r’C:pathtoapp.exe’, ‘arg1’, ‘—flag’, ‘arg’])

Сигнатура Popen очень похожа на call функцию; Однако, Popen немедленно вернуться вместо того , чтобы ждать подпроцесса для завершения , как call делает.

Ожидание завершения подпроцесса

process = subprocess.Popen([r’C:pathtoapp.exe’, ‘arg1’, ‘—flag’, ‘arg’]) process.wait()

Чтение вывода из подпроцесса

process = subprocess.Popen([r’C:pathtoapp.exe’], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # This will block until process completes stdout, stderr = process.communicate() print stdout print stderr

Интерактивный доступ к запущенным подпроцессам

Вы можете читать и писать на stdin и stdout , даже в то время как подпроцесс не завершена.

Это может быть полезно при автоматизации функций в другой программе.

Запись в подпроцесс

process = subprocess.Popen([r’C:pathtoapp.exe’], stdout = subprocess.PIPE, stdin = subprocess.PIPE) process.stdin.write(‘line of inputn’) # Write input line = process.stdout.readline() # Read a line from stdout # Do logic on line read.

Тем не менее, если вам нужно только один набор входных и выходных, а не динамическое взаимодействие, вы должны использовать communicate() , а не прямой доступом stdin и stdout .

Чтение потока из подпроцесса

Если вы хотите видеть вывод подпроцесса построчно, вы можете использовать следующий фрагмент:

process = subprocess.Popen(, stdout=subprocess.PIPE) while process.poll() is None: output_line = process.stdout.readline()

в случае, если выходные данные подкоманды не имеют символа EOL, приведенный выше фрагмент не работает. Затем вы можете прочитать вывод за символом следующим образом:

process = subprocess.Popen(, stdout=subprocess.PIPE) while process.poll() is None: output_line = process.stdout.read(1)

1 указывается в качестве аргумента к read методу говорит чтение для чтения 1 знака времени. Вы можете указать, чтобы прочитать столько символов, сколько вы хотите, используя другой номер. Отрицательное число или 0 указывает на read для чтения в виде одной строки до EOF не встречается ( см здесь ).

Как запускать игры и приложения на Python

В обоих указанных выше фрагментов, то process.poll() не является None до подпроцесса отделки. Это используется для выхода из цикла, когда больше нет выходных данных для чтения.

Же процедура может быть применена к stderr подпроцесса.

Как создать аргумент списка команд

Метод подпроцесса , что позволяет запускать команды нуждается в команде в виде списка ( по крайней мере , с помощью shell_mode=True ).

Читайте также:
Какие виды дистанций включены в программу соревнований по легкой атлетике

Правила для создания списка не всегда просты, особенно для сложных команд. К счастью, есть очень полезный инструмент , который позволяет делать это: shlex .Самый простой способ создания списка для использования в качестве команды заключается в следующем:

import shlex cmd_to_subprocess = shlex.split(command_used_in_the_shell)
import shlex shlex.split(‘ls —color -l -t -r’) out: [‘ls’, ‘—color’, ‘-l’, ‘-t’, ‘-r’]

Источник: www.codecamp.ru

Запустить другую программу из Python> отдельно

Я пытаюсь запустить внешнюю, отдельную программу из Python. Это не будет проблемой нормально, но программа — игра, и в нее встроен интерпретатор Python. Когда я использую subprocess.Popen, он запускает отдельную программу, но делает это под исходной программой Python, так что они совместно используют первую консоль Python.

Я могу закончить первую программу отлично, но я бы предпочел иметь отдельные консоли (в основном потому, что я запускаю консоль, но она отображается, когда я запускаю программу из Python с помощью subprocess.POpen). Мне бы хотелось, если бы я мог запустить вторую программу полностью самостоятельно, как будто я просто «дважды щелкнул по ней».

Кроме того, os.system не будет работать, потому что я нацелен на кросс-платформенную совместимость и доступен только в Windows.
SolarLune 26 окт. 2012, в 01:05
Поделиться
связанные: немного более сложная проблема держать несколько окон CMD открытыми из пакета
jfs 25 окт. 2012, в 23:38

Поделиться:
subprocess

2 ответа

Лучший ответ

Мне бы хотелось, если бы я мог запустить вторую программу полностью самостоятельно, как будто я просто «дважды щелкнул по ней».

Начиная с 2.7 и 3.3, у Python нет межплатформенного способа сделать это. Новый метод shutil.open может быть добавлен в будущем (возможно, не под этим именем); Подробнее см. http://bugs.python.org/issue3177. Но до тех пор вам придется написать свой собственный код для каждой интересующей вас платформы.

К счастью, то, что вы пытаетесь сделать, является более простым и менее общим, чем в конечном итоге надеется shutil.open , что означает, что это не так сложно кодировать:

  • В OS X есть команда под названием open , которая делает именно то, что вы хотите: «Команда open открывает файл (или каталог или URL-адрес), так же, как если бы вы дважды щелкнули значок файла.» Итак, вы можете просто popen open /Applications/MyGame.app .
  • В Windows эквивалентная команда start , но, к сожалению, эта часть оболочки cmd.exe , а не отдельная программа. К счастью, у Python есть функция os.startfile , которая делает то же самое, поэтому просто os.startfile(r’C:Program FilesMyGameMyGame.exe’) .
  • В FreeDesktop-совместимых * nix-системах (включая самые современные дистрибутивы linux и т.д.) существует очень похожая команда xdg-open : «xdg-open открывает файл или URL-адрес в предпочтительном приложении пользователя». Опять же, просто popen xdg-open /usr/local/bin/mygame .
  • Если вы планируете работать на других платформах, вам нужно сделать несколько исследований, чтобы найти лучший эквивалент. В противном случае, для чего бы то ни было, кроме Mac и Windows, я просто попытался бы popen xdg-open и выбросить ошибку, если это не сработает.

Обратите внимание, что это будет работать только для запуска чего-то, что на самом деле можно дважды щелкнуть, чтобы запустить в Finder/Explorer/Nautilus/etc. Например, если вы попытаетесь запустить «./ script.py», в зависимости от ваших настроек он может просто запустить текстовый редактор с вашим script в нем.

Кроме того, в OS X вы хотите запустить пакет .app, а не исполняемый файл UNIX внутри него. (В некоторых случаях запуск исполняемого файла UNIX, будь то внутри пакета .app или автономный, может работать, но не рассчитывать на него.)

Кроме того, имейте в виду, что запуск программы таким образом — это не то же самое, что запускать ее из командной строки — в частности, она наследует ее среду, текущий каталог/диск и т.д. из Windows/Launch Services/GNOME/KDE/и т.д.. а не сеанса терминала. Если вам нужно больше контролировать дочерний процесс, вам нужно будет посмотреть документацию для open , xdg-open и os.startfile и/или придумать другое решение.

Читайте также:
Как Вконтакте быть не в сети программа

Наконец, только потому, что open / xdg-open / os.startfile преуспевает, на самом деле не означает, что игра началась правильно. Например, если он запускается, а затем падает до того, как он даже может создать окно, он все равно будет для вас удачным.

Вы можете посмотреть вокруг PyPI для библиотек, которые делают то, что вы хотите. http://pypi.python.org/pypi/desktop выглядит как возможность.

Или вы можете просмотреть исправления в выпуске 3177 и выбрать тот, который вам больше нравится. Насколько я знаю, они все чистые Python, и вы можете просто просто добавить добавленную функцию в свой собственный модуль, а не в os или shutil .

Как быстрый хак, вы можете (ab) использовать webbrowser.open . «Обратите внимание, что на некоторых платформах, пытаясь открыть имя файла, используя эту функцию, может работать и запускать связанную с операционной системой программу. Однако это не поддерживается и не переносится». В частности, IIRC, он не будет работать на OS X 10.5+.

Тем не менее, я считаю, что создание файла: URL-адрес из имени файла действительно работает на OS X и Windows, а также работает на linux для большинства, но не для всех конфигураций. Если это так, это может быть достаточно хорошим для быстрого и грязного script. Просто имейте в виду, что он не документирован для работы, он может сломаться для некоторых ваших пользователей, он может сломаться в будущем, и он явно рассмотрел злоупотребления со стороны разработчиков Python, поэтому я не стал бы рассчитывать на это для чего-то более серьезного. И он будет иметь те же проблемы с запуском ‘script.py’ или ‘Foo.app/Contents/MacOS/foo’, передавая переменные env и т.д. В качестве более правильного метода выше.

Почти все остальное в вашем вопросе не имеет значения и неправильное:

Это не будет проблемой нормально, но программа — игра, и в нее встроен интерпретатор Python.

Это не имеет значения. Если игра пишут на stdout из кода C, она будет делать то же самое.

Когда я использую subprocess.Popen, он запускает отдельную программу, но делает это в рамках оригинальной программы Python instance

Нет, нет. Он запускает совершенно новый процесс, встроенный интерпретатор Python — это совершенно новый экземпляр Python. Вы можете проверить это, например, запустив другую версию Python, чем игра.

чтобы они делили первую консоль Python.

Нет, они этого не делают. Они могут иметь одно и то же окно tty/cmd, но это не то же самое.

Я могу закончить первую программу отлично, но я бы предпочел иметь отдельные консоли (в основном из-за того, что консоль запускается скрытой, но она отображается, когда я запускаю программу из Python с помощью subprocess.POpen).

Вы всегда можете подключить дочерний stdout и stderr к, например, файлу журнала, который вы могли бы затем просмотреть отдельно от вывода родительского процесса, если хотите. Но я думаю, что это происходит по касательной, которая не имеет никакого отношения к тому, что вам действительно нужно.

Кроме того, os.system не будет работать, потому что я нацелен на кросс-платформенную совместимость и доступен только в Windows.

Неправильный; os.system доступен в «Unix, Windows» — это, вероятно, везде, о чем вы заботитесь. Однако это не сработает, потому что он запускает дочернюю программу в подоболочке вашего script, используя ту же самую tty. (И у него появилось много других проблем — например, блокировка, пока ребенок не закончит.)

abarnert 26 окт. 2012, в 00:31
Поделиться

Кажется, модуль веб-браузера может автоматически подобрать xdg-open, open, startfile (). Хотя не совсем понятно, как их использовать для запуска скриптов на python, например, xdg-open script.py открывает редактор, а ./script.py в оболочке запускает его.

jfs 26 окт. 2012, в 00:19

Хорошая точка зрения. Я не думаю, что дело ./script.py здесь уместно, потому что ОП явно пытается открыть игру так же, как если бы он дважды щелкнул по ней, но все же стоит упомянуть. Кроме того, webbrowser.open определенно является хаком, но его стоит обсудить. Итак, я обновил ответ.

Читайте также:
Как сделать печать на документе программа

abarnert 26 окт. 2012, в 00:57

Спасибо за информацию, все это хорошо проверить. Странно, что нет кроссплатформенного способа просто запустить другую отдельную программу. Думаю, мне придется использовать особые случаи для каждой ОС. Во всяком случае, большое спасибо!

SolarLune 27 окт. 2012, в 03:31

Что ж, если вы прочитаете комментарии в выпуске 3177, вы поймете, почему он еще не реализован. Трудно спроектировать что-то даже чуть более гибкое, чем наименьший общий знаменатель, чтобы хорошо обрабатывать ошибки и т. Д. Похоже, что в конечном итоге мы что-то получим, но если вы не планируете выпускать код до Python 3.4 или 3.5 , это не поможет вам сейчас .

Источник: overcoder.net

Как запустить программу через другую программу питон

Для вызова внешних программ/команд системы рекомендуется ипользовать библиотеку subprocess.

Выполнение команд с получением кода возврата.

# Выполнить простую системную команду,по аналогии os.system()

ret = subprocess.call(«ls -l», shell=True)

# Выполнить простую команду, подавив вывод

ret = subprocess.call(«rm –f *.java», shell=True, stdout=open(«/dev/null»))

Вопрос в получении вывода выполняемой команды. Встречалась информация, что через call получить вывод невозможно, он виден только в выводе выполнения программы.

Однако нужно попробовать указать в параметрах:

Возможно, что затем можно получить накопленное содержимое subprocess.STDOUT в переменную. Проверить.

subprocess.PIPE — специальная константа, которая используется для аргументов stdin , stdout или stderr , обозначает объект Popen. Наличие этой константы указывает, что труба стандартного потока будет открыта.

(Оригинал на английском: Special value that can be used as the stdin, stdout or stderr argument to Popen and indicates that a pipe to the standard stream should be opened.)

subprocess.STDOUT — специальная константа, которая используется для аргументов stderr , обозначает объект Popen. Наличие этой константы указывает, что поток ошибок будет иметь тот же системный идентификатор, что и стандартный поток вывода.

(Оригинал на английском: Special value that can be used as the stderr argument to Popen and indicates that standard error should go into the same handle as standard output).

  • Использование UTF-8 в Python, устранение проблем с кодировкой
  • Основные конструкции языка Python
  • Пример стиля форматирования в Python
  • Оператор pass
  • Цикл с постусловием в Python
  • Как выйти из Python программы с кодом завершения
  • Python: пример открытия файла и перебора строк в нём
  • Python: работа со строками
  • Python: работа со списками
  • Python: тип данных bool и операторы сравнения
  • Python: запуск внешних программ и команд
  • Python: запуск внешней программы или команды
  • Работа с директориями и файлами в Python
  • Регулярные выражения в Python, простой пример
  • Python: выход из программы с кодом возврата
  • Python: преобразования типов, определение типа переменной
  • Python: списки, кортежи, словари
  • Аналог PHP-функции trim() в Python
  • Глобальные переменные в языке Python
  • Руководство по магическим методам в Питоне
  • Как в Python подсчитать количество страниц в PDF-файле
  • Основы языка программирования Python за 10 минут
  • Импорт скриптов (библиотек) в Python
  • Функции с неизвестным числом аргументов в Python и параметры по умолчанию
  • Классы в Python для PHP-разработчиков
  • Сериализация объектов в Python
  • Как в Python получить UNIX Timestamp
  • Особенности импорта модулей в Python
  • О порядке поиска пакетов и модулей для импорта в Python
  • Сводная таблица методов для базовых типов Python2 и Python3
  • Наследование в Python — краткое пояснение
  • Как в Python вызвать метод того же класса
  • Курс «Программирование на Python» от преподавателей СПбАУ РАН и ИТМО
  • Бесплатный курс pythontutor.ru (Питонтьютор)
  • Краткое описание библиотеки math
  • Как установить пакет PIP на компьютере без сети Интернет
  • Лямбда-функции в языке Python. Использование map/filter/reduce. Простое объяснение
  • Как настроить запуск главного скрипта в Python-проекте в VSCode
  • Как в VSCode в проекте на Python обеспечить навигацию по коду
  • Как в Python вызвать метод объекта по имени, которое написано в виде строковой переменной?
  • 10 ловушек в Python
  • 10 хитростей Python, о которых полезно знать

Источник: webhamster.ru

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