通过 CMD 调用多个批处理文件不会阻塞

Call to several batch files through CMD doesn't block

我正在尝试通过 CMD 使用 Python 一个接一个地调用几个 install.bat 文件。

每个 bat 文件都必须显示在交互式控制台中 window 因为它需要一些用户指令并且 python 程序只有在每个 CMD 进程被解析后才会恢复 每个 install.bat 文件可能需要相当长的时间才能完成其过程。

我的代码如下:

for game in games :
    print("----------- Starting conversion for %s -----------" %game)       
    subprocess.call("start cmd /C " + "Install.bat", cwd=os.path.join(gamesDosDir,game), shell=True)        

print("end")   

但是 shell 内的控制台 windows 会同时启动,并且 "end" 消息会在它们中的任何一个完成之前出现,而我希望它们一个一个地出现一个,直到第 n 个完成并且控制台 window 关闭(由用户或自动 /K 或 /C 然后)。

我知道这是使用 CMD 的一些问题,因为调用应该是阻塞的。如何解决?此外,如果可能的话如何保持它完全相同并添加 'Y' 和 'Y' 作为默认用户输入?

启动批处理文件(或更一般的 CLI 命令)的最常见方式是将其作为参数传递给 cmd /c。在您发表评论后,我可以假设您需要使用 start 强制创建(新)命令 window.

在这种情况下,正确的方法是将 /wait 选项添加到启动命令:它将强制启动命令等待其子进程结束:

subprocess.call("start /W cmd /C " + "Install.bat", cwd=os.path.join(gamesDosDir,game),
    shell=True)

但是@eryksun 提出了一种更简洁的方法。在 Windows 上,.bat 文件可以在没有 shell = True 的情况下执行,并且 creationflags=CREATE_NEW_CONSOLE 足以确保创建新的控制台。所以上面一行可以简单地变成:

subprocess.call("Install.bat", cwd=os.path.join(gamesDosDir,game),
    creationflags = subprocess.CREATE_NEW_CONSOLE)