なぜこれが起こっているのかを理解しようとしていました。Ubuntu サーバー 12.04 でネットワークを再起動するコマンドを呼び出しています。
高速実行
次の 3 つの方法のいずれかを使用してコマンドを呼び出すと、実行に約 0.1 秒かかります。
- ターミナルで直接
- を使用した python スクリプト
os.system
- を使用した 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