Как я могу создать новые оболочки для запуска скриптов Python из базового скрипта Python? - PullRequest
27 голосов
/ 24 июня 2011

Я успешно запустил несколько скриптов Python, вызывая их из базового скрипта с помощью модуля подпроцесса:

subprocess.popen([sys.executable, 'script.py'], shell=True)

Однако каждый из этих сценариев выполняет некоторые моделирования (файлы .exe из приложения C ++), которые генерируют некоторый вывод в оболочку. Все эти выходные данные записываются в базовую оболочку, откуда я запустил эти скрипты. Я хотел бы создать новую оболочку для каждого скрипта. Я пытался сгенерировать новые оболочки, используя атрибут shell=True при вызове subprocess.call (также пробовал с popen), но он не работает.

Как получить новую оболочку для каждого процесса, сгенерированного с помощью subprocess.call?

Я читал документацию о stdin и stdout, предложенную Спенсером, и обнаружил флаг, который решил проблему: subprocess.CREATE_NEW_CONSOLE. Возможно, перенаправление каналов тоже делает свою работу, но это, кажется, самое простое решение (по крайней мере, для этой конкретной проблемы). Я только что проверил и отлично работал:

subprocess.popen([sys.executable, 'script.py'], creationflags = subprocess.CREATE_NEW_CONSOLE)

Ответы [ 3 ]

41 голосов
/ 16 декабря 2013

Чтобы открыть в другой консоли, выполните (протестировано в Windows 7 / Python 3):

from sys import executable
from subprocess import Popen, CREATE_NEW_CONSOLE

Popen([executable, 'script.py'], creationflags=CREATE_NEW_CONSOLE)

input('Enter to exit from this launcher script...')
10 голосов
/ 24 июня 2011

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

Если вы не перенаправляете эти каналы, он наследует их от родителя. Просто будьте осторожны с блокировкой ваших процессов.

Вы хотели дополнительные окна для каждого подпроцесса. Это также обрабатывается. Посмотрите на раздел startupinfo подпроцесса. Он объясняет, какие параметры нужно установить в Windows для создания нового терминала для каждого подпроцесса. Обратите внимание, что для этого требуется использовать параметр shell = True.

2 голосов
/ 24 июня 2011

Это на самом деле не отвечает на ваш вопрос. Но у меня тоже были проблемы с подпроцессом, и pexpect оказался действительно полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...