我试图用Python通过CMD一个接一个地调用几个install.bat文件。
每个bat文件都必须显示在交互式控制台窗口中,因为它会询问一些用户指令,并且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中的控制台窗口是一次性启动的,并且“end”消息在任何一个完成之前出现事件,而我希望它们一个接一个地出现而不是去n + 1,直到n一个完成并且控制台窗口关闭(由用户或自动/ K或/ C然后)。
我理解这是使用CMD的一些问题,因为调用应该是阻塞的。怎么解决?另外,如果可能的话,如何保持它完全相同并添加“Y”和“Y”作为默认用户输入?
答案 0 :(得分:0)
启动批处理文件(或更常见的CLI命令)的最常用方法是将其作为参数传递给cmd /c
。在您发表评论后,我可以假设您需要使用start
来强制创建(新)命令窗口。
在这种情况下,正确的方法是将/wait
选项添加到start命令:它将强制start命令等待其子进程的结束:
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)