2011-06-13 14:29:51
自分用の覚書。
以前、PythonでもPHPのshell_execみたいに、外部コマンドを実行してその標準出力の結果を受け取れればいいのにとここに書いたことがあるのだが、ようやくその方法が判った。前は検索しても関連することが全然見つからなかったのに、今はすぐに出てくる。一番下にリンクを並べておいた。
subprocessというモジュールを使えばいいらしい。私はpdftotextというコマンドの結果を受け取りたいので、"pdftotext xxx.pdf - "というコマンドを想定している。xxx.pdfというpdfファイルからテキストを抽出したい。最後の"-"は、yyy.txtというようなファイルに出力して保存するのではなくて結果を標準出力にするという指示である。早速試してみる。
from subprocess import Popen, PIPE cmdline = "pdftotext xxx.pdf -" p = Popen(cmdline, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True) while True: line = p.stdout.readline() if not line: break print line.rstrip()
結果がちゃんと表示された。別の例を参考にして、書いてみると、
from subprocess import Popen, PIPE import shlex
cmdline = "pdftotext xxx.pdf -" args = shlex.split(cmdline) result = Popen(args, stdout=PIPE).stdout.readlines()
for str in result: print str.rstrip()
結果がちゃんと表示された。上と違うのは、コマンドをshlex.splitで処理をしているところ。この処理で、コマンドは['pdftotext','to','-']という配列になっている。どうしてこっちは配列でないとエラーになって、上では配列だとエラーになるのだろうか。よく判らない。でも、今はうまくいく方を使えばいいということにして、先に進むことにしよう。
参考にしたサイト。
1. Pythonで外部プロセスを起動して出力と戻り値を処理する
2. subprocess モジュールでパイプによる入出力を扱うときの注意事項
3. 17.1. subprocess — サブプロセス管理