9

なぜこれが起こっているのかを理解しようとしていました。Ubuntu サーバー 12.04 でネットワークを再起動するコマンドを呼び出しています。

高速実行

次の 3 つの方法のいずれかを使用してコマンドを呼び出すと、実行に約 0.1 秒かかります。

  1. ターミナルで直接
  2. を使用した python スクリプトos.system
  3. を使用した python スクリプトsubprocess.call

端末セッション:

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

アップデート

コメントの 1 つは、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
4

1 に答える 1