这是一些我无法解释的好奇心。请考虑以下代码段:
import subprocess
command = ['tasklist.exe', '/m', 'imm32.dll']
p = subprocess.Popen(command, stdout=subprocess.PIPE)
out, err = p.communicate()
对communicate()
的调用挂了,我不得不用 Ctrl + C 突破。之后,任务列表进程仍在运行,我必须使用taskkill.exe
将其杀死。请查看下表中tasklist.exe的行为:
| Command | Behavior |
|-------------------------------------|----------|
| ['tasklist.exe', '/m', 'imm32.dll'] | Hung |
| ['tasklist.exe', '/m'] | Hung |
| ['tasklist.exe'] | OK |
似乎存在/m
标志时,进程不会返回。它只是永远运行。我也试过以下内容并且还挂了:
os.system('tasklist.exe /m imm32.dll')
如何启动此命令而不挂起?
事实证明,communicate
调用没有挂起,但需要花费10分钟才能完成,如果我从cmd.exe提示符运行命令,则会花费几秒钟。我相信这与缓冲有关,但还没有办法让它更快完成。