我试图理解为什么会发生这种情况。我正在调用一个命令来重新启动Ubuntu服务器12.04上的网络。
快速执行
当我使用以下三种方式之一调用命令时,执行时间大约为0.1秒:
1. 直接在终端中执行 2. 使用`os.system`的Python脚本 3. 使用`subprocess.call`的Python脚本
终端会话:
快速执行
当我使用以下三种方式之一调用命令时,执行时间大约为0.1秒:
1. 直接在终端中执行 2. 使用`os.system`的Python脚本 3. 使用`subprocess.call`的Python脚本
终端会话:
root@ubuntu:~# time /etc/init.d/networking restart
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m0.105s
root@ubuntu:~# time python -c "import os;
> os.system('/etc/init.d/networking restart')"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m0.111s
root@ubuntu:~# time python -c "import subprocess;
> subprocess.call(['/etc/init.d/networking', 'restart'])"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m0.111s
执行缓慢
然而,如果我使用 subprocess.check_output
或者 Popen 并尝试读取输出,那么花费的时间将会是23秒。速度慢得多。这种显著差异似乎只发生在我尝试使用会返回命令输出的函数时。我想要了解为什么会发生这种情况,并找到一种解决方法来执行此命令并快速获取其输出。
终端会话:
root@ubuntu:~# time python -c "import subprocess;
> print subprocess.check_output(['/etc/init.d/networking', 'restart'])"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m23.201s
root@ubuntu:~# time python -c "from subprocess import Popen, PIPE;
> print Popen(['/etc/init.d/networking', 'restart'], stdout=PIPE).stdout.read()"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m23.201s
更新
其中一条评论建议尝试使用 tee 命令。结果非常有趣。在终端中,如果不涉及 Python,并使用 tee 命令,需要相同的 23 秒。我仍然很好奇为什么会这样,但至少这可能提供了更多关于发生情况的线索。
root@ubuntu:~# time /etc/init.d/networking restart | tee out.txt
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m23.181s
close_fds = True
- James Waldby - jwpat7subprocess.call()
就是subprocess.Popen(*popenargs, **kwargs).wait()
。 - Blendernetworking restart | tee some_file
的时间需要多久(检查一下some_file
是否为空)。尝试使用bufsize=-1
和/或f = TemporaryFile(); check_call(cmd, stdout=f, stderr=STDOUT); f.seek(0); output = f.read()
。 - jfs