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