subprocessモジュールの簡単な使い方(python) | 世界的日曜WEBプログラマー日記

世界的日曜WEBプログラマー日記

一年後に世界的なWEBサービスを運営するにはどうすればいいのか書いていく(予定)

今回はsubprocessモジュールの簡単な使い方について



Python大好きお弁当屋の等々力です。
ソフトウェアのダイナプティコでは、Pythonがメインの言語です。

今回はsubprocessモジュールの使い方を説明します。
新人の頃、やたら難しいように感じていたのを覚えています。
osモジュールにも同じような関数があり、os.Popenでいいやん!とか思っていました。

subprocess de python!!


Python 2.4 から OS のコマンドを実行したり、それらの標準入出力/エラー出力のやり取りをするのに subprocess モジュールが追加されています。
os系にしか無いコマンドでos.popenを使いたい場合、素直にsubprocessモジュールでやるといいです。
更に、subprocessの場合はpopenでなく、call関数の方が使い勝手がいいです。callは次のように使います。

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

Popenと殆ど変わらりません。
ただ、オブジェクトを返すか返さないかがあり、自前で完結して欲しい場合などで差が出ます。
違いは次のとおりです。
・subprocess.Popen は Popen オブジェクトをリターン,
・subprocess.call は終了コードをリターン

subprocess.call関数定義をみると実は次のようになっています。
def call(*popenargs, **kwargs):
p = subprocess.Popen(*popenargs, **kwargs)
return p.wait()
中でpopenを呼んでいるんですね。

callの方がいいのですが、popenの使い方も一応説明しておきます。具体的な方が解りやすいと思うのでsubprocess.Popenの使い方を次に載せます。

import subprocess
cmdline = ['ls', '-l']
cmd1 = subprocess.Popen(cmdline, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT )
cmdline2=['sort', '-k', '5,5']
f=file( 'ret.txt', 'w' )
ans1 = subprocess.Popen(cmdline2, stdin = cmd1.stdout,
stdout= f,
stderr=subprocess.STDOUT )
f.close()



ディスクリプターを指定することができ、またパイプも自由自在に扱うことが出来ます。

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house