Как я могу порождать новые оболочки для запуска скриптов python с базового python script?

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

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

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

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

Спасибо.

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

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

Спасибо всем!

Ответы

Ответ 1

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

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

EDIT:

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

ИЗМЕНИТЬ 2:

Да, почему-то я пропустил раздел о создании новой консоли. Спасибо, что указали это.

Ответ 2

Чтобы открыть в другой консоли, выполните (протестируйте на Win7/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...')

Ответ 3

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