Выполнить несколько программ последовательно в одной командной строке Windows?

Мне нужно запускать несколько программ один за другим, и каждый из них запускается в окне консоли. Я хочу, чтобы окно консоли было видимым, но для каждой программы создается новое окно. Это раздражает, потому что каждое окно открывается в новом положении, из которого другое закрывается, и крадет фокус при работе в Eclipse.

Это начальный код, который я использовал:

def runCommand( self, cmd, instream=None, outstream=None, errstream=None ): proc = subprocess.Popen( cmd, stdin=instream, stdout=outstream, stderr=errstream ) while True: retcode = proc.poll() if retcode == None: if mAbortBuild: proc.terminate() return False else: time.sleep(1) else: if retcode == 0: return True else: return False 

Я переключился на открытие командной строки с помощью команды «cmd» при вызове subprocess.Popen и вызове proc.stdin.write (b'program.exe \ r \ n '). Это, похоже, решает проблему с одним командным окном, но теперь я не могу сказать, когда первая программа будет выполнена, и я могу запустить вторую. Я хочу остановить и допросить файл журнала из первой программы перед запуском второй программы.

Какие-нибудь советы о том, как я могу это достичь? Есть ли еще один вариант для запуска программ в одном окне, который я еще не нашел?

2 Solutions collect form web for “Выполнить несколько программ последовательно в одной командной строке Windows?”

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

 import os import subprocess import textwrap # create a batch file with some commands in it batch_filename = 'commands.bat' with open(batch_filename, "wt") as batchfile: batchfile.write(textwrap.dedent(""" python hello.py if errorlevel 1 ( @echo non-zero exit code: %errorlevel% - terminating exit ) time /t date /t """)) # execute the batch file as a separate process and echo its output kwargs = dict(stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) with subprocess.Popen(batch_filename, **kwargs).stdout as output: for line in output: print line, try: os.remove(batch_filename) # clean up except os.error: pass 

В разделе 17.5.3.1. Константы в документации модуля подпроцесса содержат описание subprocess.CREATE_NEW_CONSOLE константа:

Новый процесс имеет новую консоль, а не наследует консоль своего родителя (по умолчанию).

Как видим, по умолчанию новый процесс наследует консоль своего родителя. Причина, по которой вы наблюдаете открытие нескольких консолей, – это тот факт, что вы вызываете свои сценарии из Eclipse, который сам не имеет консоли, поэтому каждый подпроцесс создает свою собственную консоль, так как нет никакой консоли, которую он мог бы наследовать. Если кто-то захочет моделировать это поведение, достаточно запустить скрипт Python, который создает подпроцессы с использованием pythonw.exe вместо python.exe . Разница между ними состоит в том, что первая не открывает консоль, а вторая -.

Решение состоит в том, чтобы иметь вспомогательный скрипт – назовем его launcher – который по умолчанию создает консоль и запускает ваши программы в подпроцессах. Таким образом, каждая программа наследует одну и ту же консоль от своего родителя – пусковой установки . Чтобы последовательно запускать программы, мы используем Popen.wait() .

— script_run_from_eclipse.py —

 import subprocess import sys subprocess.Popen([sys.executable, 'helper.py']) 

— helper.py —

 import subprocess programs = ['first_program.exe', 'second_program.exe'] for program in programs: subprocess.Popen([program]).wait() if input('Do you want to continue? (y/n): ').upper() == 'N': break 
Interesting Posts

Как избежать использования токенизатора предложения NLTK, разделяющего аббревиатуры?

Как получить новейший каталог в Python

Использование представления __str__ для печати объектов в контейнерах в Python

Парамико: «FutureWarning: режим CTR требует параметра счетчика»

разметка часового пояса с помощью двоеточия

Максимальное ограничение байтов в обновлении метода модуля Hashlib Python

Каковы ограничения подключения для Google Cloud SQL от App Engine и как лучше всего использовать соединения с БД?

Python: найдите эквивалентную суррогатную пару от символа unicode без BMP

Анзибль. переопределить один ключ словаря

добавление каталога в sys.path / PYTHONPATH

Ошибки модуля подпроцесса с «export» в python на linux?

Как получить многострочный ввод от пользователя

Почему не супер (Thread, self) .__ init __ () работает для threading.Thread подкласс?

Сериализация JSON моделей Google App Engine

ConfigParser считывает ключи капитала и делает их нижним регистром

Python - лучший язык программирования в мире.