为了测试和个人概念证明,我有一个.exe文件,它只输出一个简单的字符串,然后调用系统暂停(在C ++中逐字地system("pause")
)。
我有一个简单的Python脚本,我在Windows XP VM上进行测试,在搞乱时执行这些操作:
subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)
显然,这些命令在命令行上都可以正常运行,为什么它们在通过Python调用时不能正常工作?
我收到此弹出错误消息:
blank.txt:ads.exe遇到过 问题和需要关闭。我们是 很抱歉给您带来不便。
如果你在中间 什么,你的信息 工作可能会丢失。
该文件确实已删除。似乎系统暂停只是被删除命令压缩,当我希望弹出.exe,等待我按下回车,然后脚本将继续并删除文件。
答案 0 :(得分:1)
每个subprocess.call(..., shell=True)
都会立即返回,因为它们只是告诉shell执行命令。在命令行上,即使exe没有终止,调用exe使用start
命令运行仍然会立即返回。 start
立即返回,需要告知等待:
subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start /wait c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)
答案 1 :(得分:1)
鉴于这些症状,我的理解是,只有在此可执行文件完成初始化后,您才能安全地删除此特定设置中的可执行文件(Windows XP,可能在特定的修补程序级别,当可执行文件来自备用流时)。如果在加载时删除了可执行文件,程序将崩溃。
在提示符下键入这些命令时,在运行start c:\blank.txt:ads.exe
和del c:\blank.txt
之间会有一段时间,为程序提供足够的时间来完成加载。当您从脚本运行它们时,两者之间的间隔要短得多(start
分支一个新进程,并且新程序的初始化异步发生)。初始化和删除之间存在竞争条件;哪一个获胜取决于删除的执行时间。
在删除文件之前尝试尝试延迟:
import subprocess, time
subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
time.sleep(42) # 42 seconds is overkill, but the delay isn't predictable
subprocess.call(r'del c:\blank.txt', shell=True)
答案 2 :(得分:0)
windows shell start
命令将在新shell中启动程序,然后继续。等待它完成使用call
:
subprocess.call(r'call c:\blank.txt:ads.exe', shell=True)