PyPy でシェルコマンドを実行

PyPy で実行される環境にある Web アプリのプログラムからシェルコマンドを実行する必要が生じた。具体的に言うとその時は Ansible の Playbook を実行したかった。PythonスクリプトからAnsibleを呼ぶ方法もあったのだけど、その時は思い付かなかった。

こういった外部コマンド実行には subprocess モジュールを使うのが一般的なようだが、残念なことに PyPy ではこの subprocess モジュールが実装されていなかった。
os モジュールは実装されていたので exec や spawn 系の関数は使えるが、標準出力のコマンド実行結果を取得する方法が分からない。

そんな時に見つけたのが sh ライブラリ
sh.コマンド名(引数)
という至極簡単な文法で任意のコマンドを呼び出せ、結果を取得できる優れもの。
あいにく ansible-playbook のようなハイフンが入るコマンド名はリテラルとして使えないので、次のように Command インスタンスを生成して使う。

import sh

playbook = sh.Command('ansible-playbook')
output = playbook('-i', '/path/to/hosts', '/path/to/playbook.yml')

超便利。

Last updated on September 3, 2015