让我们首先分析两个发布的Python脚本行在执行Python脚本时真正做了些什么。感谢eryksun进行深入调查,真正使用Python导致正确的描述,现在可以在下面阅读。
os.system()导致在前台使用控制台窗口执行cmd.exe /C并停止执行Python脚本,直到Windows命令解释程序终止。如果Python脚本本身在控制台中执行,则启动的cmd.exe将继承此控制台。
此命令进程以start开始,内部命令为cmd.exe,另一个命令进程带有前台控制台窗口。很好,但是第二个命令进程在完成命令执行后立即终止。如果您希望在运行Python脚本时看到执行脚本或Python解释器本身输出错误,那就不太好了。
因此,第二个命令进程使用选项cmd.exe启动/k以继续运行此命令进程,继承由start创建的控制台,并在完成指定命令的执行后打开控制台窗口
第二个命令进程运行内部命令call,这完全没有必要,因为python是真实的python.exe,一个控制台应用程序而不是批处理文件。因此,根本不需要call。
建议始终使用完整的文件名指定应用程序和脚本,即文件名+文件扩展名,而不仅仅是文件名。如果已知并修复了可执行文件/脚本的路径,则也应指定它。这使得应用程序/脚本的执行独立于当前目录和环境变量PATHEXT和PATH。
Python解释器在第二个控制台中执行指定的Python脚本。
os.system()完成后,第一个命令进程在start完成后立即终止,这在cmd.exe /k开始python.exe并且command = 'start cmd.exe /K python.exe %s ^&^& exit' % (some_py_prog)
os.system(command)正在解释Python脚本时已经发生。
剩下的就是使用脚本运行Python解释器的第二个命令进程。即使在完成指定Python脚本的执行后Python解释器终止后,此命令进程仍会继续运行。
因此,一旦Python解释器完成Python脚本的执行,目标是终止第二个命令进程和控制台窗口,但前提是脚本执行时没有错误。
好吧,我根本没有安装Python,但我认为它在执行脚本时出现错误,返回代码大于0。否则,在成功执行脚本时退出代码为0。
因此可以使用这样的命令:
start cmd.exe /K
由python.exe开始的第二个命令进程执行的命令行现在包含两个命令:
Python解释器exit,脚本作为参数执行
和
内部命令0,只有当第一个命令的退出代码为&&时,由于操作符^,Windows命令解释程序才应执行第二个命令。
醇>
每个&符号必须使用Windows命令解释器的转义字符进行转义,该命令解释符是插入符号&&。这是必要的,否则start将被运行start的第一个命令进程解释,作为在成功执行Test.bat后运行的附加命令。
请注意,我没有安装Python,因此只需在命令提示符窗口中使用批处理文件@echo %~dp0 executed. & exit /B 1和单个命令行start cmd.exe /K call Test.bat ^&^& exit进行测试。
Test.bat
call是批处理文件,而不是需要使用命令Test.bat的可执行文件。没有特定窗口标题的启动命令进程保持打开状态,因为Test.bat退出并返回代码1.如果我在{{1}}命令行末尾修改数字1到0,则启动的命令进程退出。
当然,使用此解决方案时,脚本代码本身必须停止脚本代码检测到的错误的脚本执行。