2

为了测试和个人概念证明,我有一个 .exe 文件,它只输出一个简单的字符串,然后调用系统暂停(字面意思system("pause")是 C++)。

我有一个简单的 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 遇到问题需要关闭。对此造成的不便,我们表示歉意。

如果您正在处理某事,您正在处理的信息可能会丢失。

该文件也确实被删除了。看来系统暂停只是被delete命令压碎了,当我期望.exe弹出时,等我推回车,然后脚本会继续删除文件。

4

3 回答 3

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)
于 2011-05-20T20:28:59.077 回答
1

发生的情况是每个subprocess.call(..., shell=True)都立即返回,因为它们只是告诉 shell 执行命令。在命令行上,使用该start命令调用 exe 运行仍然会立即返回,即使该 exe 尚未终止。立即返回,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)
于 2011-05-20T20:01:12.907 回答
0

windows shellstart命令将在新的 shell 中启动程序,然后继续。等待它完成使用call

subprocess.call(r'call c:\blank.txt:ads.exe', shell=True)
于 2011-05-20T20:21:26.497 回答