Pythonスクリプト内でbashコマンドを呼び出す

方法はcommandモジュールを使うか,subprocessモジュールを使うか?という選択肢があるようだ.

で,commandモジュールには前に失敗した記憶があるので(自分が悪い),どっちかというとsubprocessを好んでいる.

使い方は,importして

import subprocess

subprocess.Popenメソッドに引数を与えていく.実行したコマンドはリスト中に文字列型で入力して渡す.例えば,echo "People"のコマンドなら,

subprocess.Popen(['echo', 'People']);

もしかしてPIPEで次のコマンドに結果を渡したいときがあるかもしれない.例えば,fomaというFSTを呼び出す際には

echo "word" | flookup -i -x mytransducer.foma

とコマンドを打つ必要がある.

このようなPIPEをsubprocessで実現するには,引数にstdin, stdoutを加え,そしてPIPEの前コマンドと後ろのコマンドを分離する.具体的には

echo=subprocess.Popen(['echo', input_word], stdout=subprocess.PIPE);
foma=subprocess.Popen(['flookup', '-x', 'farsi2.bin'], stdin=echo.stdout, stdout=subprocess.PIPE);
output=foma.stdout;

最後の行のoutputには,コマンドの実行結果が文字列型として格納されている.

これを最初からスクリプトで記述すると,

#! /usr/bin/python
# -*- coding:utf-8 -*-

import sys, re, codecs, subprocess;

input_word=sys.argv[1];

echo=subprocess.Popen(['echo', input_word], stdout=subprocess.PIPE);
foma=subprocess.Popen(['flookup', '-x', 'farsi2.bin'], stdin=echo.stdout, stdout=subprocess.PIPE);
output=foma.stdout;

for line in output:
    print line;

参考までに
subprocessとコマンドラインとリダイレクト - Screaming Loud