这些os.popen命令会并行运行吗?

时间:2019-10-18 07:41:15

标签: python python-2.7 popen

如果我在循环中运行一系列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的旧脚本中的错误,并且希望检查是否可以并行执行命令。

1 个答案:

答案 0 :(得分:0)

更新

您遇到的read()失败,因为['cm1', 'cmd2', 'cmd3']是无效命令。即使在调试器上,如果您暂停并尝试执行os.popen(cmd).read(),它将永远评估。运行time.sleep()而不是在for循环中是一个不错的主意,因为这样一来您将无法获得所需的结果。有效的测试将是在控制台中运行'sleep',并且由于来自TIMEOUT的{​​{1}}重定向了输入,但失败了,我们可以使用上面的示例:

popen()

在这种情况下,第一个命令将有10秒的延迟,我们可以看到这些进程不会同时运行,而一个则等待另一个完成。 以下是结果以及每个进程运行的时间:

1571386961.499955

import os
import time
for cmd in ['ping -n 3 127.0.0.1', 'ping -n 5 127.0.0.1', 'tree']:
    print(time.time())
    print(os.popen(cmd).readline())

1571386975.433736

Pinging 127.0.0.1 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 127.0.0.1:
    Packets: Sent = 3, Received = 0, Lost = 3 (100% loss),

1571386999.4259672

Pinging 127.0.0.1 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 127.0.0.1:
    Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),