2011/04/25

PythonからWindowsのコマンドを呼び出す方法

C:\>python

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> import subprocess
>>> p= subprocess.Popen(['ver'],shell=True, stdin=subprocess.PIPE ,stdout=subprocess.PIPE)

>>> for i in p.stdout.read().split('\n'):
... print i
...
Microsoft Windows [Version 6.1.7601]

ね。簡単でしょ。
Pythonから別のプロセスを呼び出すのはSubProcessというモジュールを使ってやるのがスマートらしい。

Python2.5系では

subprocess.Popen(['ver'],shell=True, stdin=subprocess.PIPE ,stdout=subprocess.PIPE)

1つ目の引数が実行したいコマンド。今回はWindowsのビルドバージョンを表示するコマンド。
2つ目の引数はコマンドプロンプト上で実行されるコマンドの場合True。他のアプリを呼ぶ際などはいらないです。
3つ目、4つ目は入出力に関して。

実行結果が複数行にわたる場合でも p.stdout.read().split('\n') で改行ごとに区切ってあげれば1行ずつ取り出せます。
気を付ける点は 上のプログラムだとこの後にもう一回 p.stdout.read().split('\n') をやったとしてもその際には変数pの中は空っぽになっているという点。(エラーは出ません)
元々Pythonは代入ではなくて参照なので、1回出力されたモノは2回目も利用する場合は再度呼び出すか、さらに別の変数に格納してあげる必要があります。

これに気がつかないで結構苦労しました;p
さて、これでPython2.5系からWindowsのコマンドを呼び出して標準出力の結果を取り込むんでごにょごにょできます。
あえて2.5系でのやり方を調べたのは、Python2.7系からもっと簡単な方法が用意されているから。

Python2.7系では同じくSubProcessモジュールに check_output が用意されています。
もっと単純にコマンドを呼び出せてリターンも扱いやすいです。

もっとも、WindowsXPとかで動かすことがあるならPy2exeを使うならPython2.5系をお勧めする理由という事もあるかもしれないので、2.5系で書けることなら書いた方がいいかもね;p