在一个Windows命令提示符中按顺序运行多个程序?

时间:2010-12-11 03:59:57

标签: python windows eclipse console subprocess

我需要一个接一个地运行多个程序,并且每个程序都在控制台窗口中运行。 我希望控制台窗口可见,但是为每个程序创建了一个新窗口。这很烦人,因为每个窗口都是在一个新位置打开,另一个窗口关闭,在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

我在调用subprocess.Popen然后调用proc.stdin.write(b'program.exe \ r \ n')时切换到使用'cmd'打开命令提示符。 这似乎解决了一个命令窗口问题,但现在我无法判断第一个程序何时完成,我可以开始第二个程序。我想在运行第二个程序之前停止并查询第一个程序中的日志文件。

有关如何实现这一目标的任何提示?是否有另一种选择在一个窗口中运行我尚未找到的程序?

2 个答案:

答案 0 :(得分:6)

由于您使用的是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

答案 1 :(得分:0)

17.5.3.1节中。 子流程模块文档中的常量 subprocess.CREATE_NEW_CONSOLE常量description

  

新进程有一个新的控制台,而不是继承其父进程   控制台(默认)。

正如我们所见,默认情况下,新进程继承其父控制台。您观察到打开多个控制台的原因是您从Eclipse中调用脚本,而Eclipse本身没有控制台,因此每个子进程都创建自己的控制台,因为它没有可以继承的控制台。如果有人想要模拟这种行为,那么运行Python脚本就足够了,它使用 pythonw.exe 而不是 python.exe 来创建子进程。两者之间的区别在于前者没有打开控制台而后者则打开控制台。

解决方案是使用帮助程序脚本 - 让我们称之为启动程序 - 默认情况下,它会创建控制台并在子进程中运行程序。这样,每个程序都从其父级 - 启动程序继承同一个控制台。要按顺序运行程序,我们使用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