[如果我在一个循环中运行一系列os.popen(...)
语句,并在每个语句后附加一个read()
,这些命令将并行运行,还是read()
调用使代码等待直到每个进程终止在继续之前?
for cmd in ['cmd1', 'cmd2', 'cmd3']:
os.popen(cmd).read()
通过阅读文档,我认为这些命令可以同时运行,但是我尝试了一个实验,在这样的循环中启动了一系列的sleep 1
命令:
for cmd in ['sleep 1', 'sleep 1', 'sleep 1']:
os.popen(cmd).read()
并且原本希望它们同时运行,但是popen
似乎要等到每个睡眠命令完成后才能继续执行下一个,所以现在我不确定。
我知道不推荐使用os.popen
,而应该使用subprocess
模块,但是我正在研究使用os.popen
的旧脚本中的错误,并希望检查是否并行执行命令可能会发生。
您遇到的read()
失败,因为['cm1', 'cmd2', 'cmd3']
是无效命令。即使在调试器上,如果您暂停并尝试执行os.popen(cmd).read()
,它将永远评估。运行time.sleep()
而不是在for循环中是一个不错的主意,因为这样您将无法获得所需的结果。一个有效的测试是在控制台中运行'sleep'
,由于TIMEOUT
中的popen()
重定向了输入,但失败了,我们可以使用上面的示例:
import os
import time
for cmd in ['ping -n 10 127.0.0.1', 'ping -n 5 127.0.0.1', 'tree']:
print(time.time())
print(os.popen(cmd).readline())
在这种情况下,第一个命令将有10秒钟的延迟,即使命令存在延迟,我们也可以看到进程几乎同时运行。这是结果以及每个进程运行的时间:
1571385931.0027845
1571385931.0755885
1571385931.1144824
Folder PATH listing