我需要一个接一个地运行多个程序,它们每个都在控制台窗口中运行。我希望控制台窗口可见,但是会为每个程序创建一个新窗口。这很烦人,因为在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时,我切换为使用“ cmd”打开命令提示符,然后调用proc.stdin.write(b’program.exe \ r \ n’)。这似乎解决了一个命令窗口的问题,但现在我不知道第一个程序何时完成,而我可以启动第二个。我想在运行第二个程序之前停止并查询第一个程序的日志文件。
关于如何实现此目标的任何提示?是否有另一个选项可以在我尚未找到的一个窗口中运行程序?
由于使用的是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