我正在运行多个进程(数百个),每个进程都是使用以下命令调用的python程序:
command = 'start cmd /k call python %s' % (some_py_prog)
os.system(command)
在执行命令后,/k会保留cmd窗口以便检查错误。然而,当我调用数百个作业时,我的屏幕变得混乱。
那么如何让Python仅在成功完成时关闭其自己的主机cmd窗口?我需要看到出错的作业。
我正在运行多个进程(数百个),每个进程都是使用以下命令调用的python程序:
command = 'start cmd /k call python %s' % (some_py_prog)
os.system(command)
在执行命令后,/k会保留cmd窗口以便检查错误。然而,当我调用数百个作业时,我的屏幕变得混乱。
那么如何让Python仅在成功完成时关闭其自己的主机cmd窗口?我需要看到出错的作业。
/c
而不是/k
将导致cmd脚本在命令终止时立即退出,这正是您要求的。command = 'start cmd /c call python %s' % (some_py_prog)
os.system(command)
但是你在这里堆叠了一些不必要的 cmd.exe
:一个用于 os.system
调用,一个用于明确的 cmd.c
。你可以简单地使用 subprocess
模块:
subprocess.call('python %s' % (some_py_prog),
creationflags = subprocess.CREATE_NEW_CONSOLE)
shell=True
选项。os.system()
会导致在前台执行cmd.exe /C
,并生成一个控制台窗口,直到Windows命令解释器终止才会继续执行Python脚本。如果Python脚本本身在控制台中执行,则启动的cmd.exe
会继承该控制台。start
开始,它是cmd.exe
的内部命令,生成一个带有前景控制台窗口的命令进程。没错,但是这第二个命令进程在执行命令后立即终止。如果您想查看由执行脚本或Python解释器本身产生的错误输出,则不太好。/k
启动cmd.exe
,以保持运行,继承由start
创建的控制台和在完成指定命令的执行后打开的控制台窗口。call
,这根本不必要,因为python
实际上是python.exe
,是一个控制台应用程序,而不是批处理文件。因此,根本不需要使用call
。PATHEXT
和PATH
。os.system()
启动的第一个命令进程在start
完成后立即终止,而这已经发生在启动cmd.exe /k
时,而python.exe
正在解释Python脚本。command = 'start cmd.exe /K python.exe %s ^&^& exit' % (some_py_prog)
os.system(command)
第二个命令进程启动的执行命令行为start cmd.exe /K
,现在包含两个命令:
python.exe
和要执行的脚本作为参数exit
,这个第二个命令应该由Windows命令解释器执行,只有在第一个命令的退出代码是0
的情况下才会执行,因为使用了运算符&&
。有关单个命令行中包含多个要执行的命令的详细信息,请参见Single line with multiple commands using Windows batch file上的答案。
在此必须使用Windows命令解释器的转义字符——插入符号^
来转义每个&符号。否则,&&
将被第一个运行start
的命令进程解释为成功执行start
后要运行的附加命令。
请注意,我没有安装Python,因此仅从命令提示符窗口使用批处理文件Test.bat
进行以下测试,其中包含单个命令行@echo %~dp0 executed. & exit /B 1
。
start cmd.exe /K call Test.bat ^&^& exit
Test.bat
是批处理文件而不是可执行文件,需要使用命令call
。由于Test.bat
以返回代码1退出,因此没有特定窗口标题的启动命令进程仍然保持打开状态。如果我在命令行末尾将数字1修改为0,则启动的命令进程自行退出。
当脚本代码检测到错误并使用此解决方案时,当然需要脚本代码本身停止脚本执行。