Как я могу порождать новые оболочки для запуска скриптов 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 оказалось действительно полезным.