Запускать несколько программ последовательно в одной командной строке Windows? - PullRequest
6 голосов
/ 11 декабря 2010

Мне нужно запускать несколько программ одну за другой, каждая из которых запускается в окне консоли.Я хочу, чтобы окно консоли было видимым, но для каждой программы создается новое окно.Это раздражает, потому что каждое окно открывается в новой позиции, из которой закрывается другое, и крадет фокус при работе в 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 ]

6 голосов
/ 11 декабря 2010

Поскольку вы используете 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
0 голосов
/ 03 ноября 2013

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

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

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

Решение состоит в том, чтобы иметь вспомогательный скрипт - назовем его launcher - который по умолчанию создаетконсоль и запускает ваши программы в подпроцессах.Таким образом, каждая программа наследует одну и ту же консоль от своего родителя - 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...