唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

続Pythonでsubprocessを使って複数のコマンドをパイプでつなぐ

以前Pythonのライブラリのsubprocessを使って、パイプでつないで複数のコマンドを実行するという内容の記事を書きました

しかしsubprocessのドキュメントなどに書かれている方法はめんどくさいので、どうしてもPythonでやる場合には以下の簡単な方法がおすすめです

subprocessでshを呼んで、shに引数として渡して実行させる

コマンドをパイプでつなげてその出力を得るにはこの方法が楽だと思います

import subprocess
print subprocess.check_output('sh -c "echo {} | mecab"'.format('パイプでつなげる'), shell=True)

IPythonを使う

以前も紹介した高機能な対話的シェルのIPythonにはシェルコマンドの結果を変数に代入してくれる機能があるので、ちょっと試してみる分にはこちらのほうが使いやすいかもしれません

以下をIPythonで実行するとコマンドの結果が出力できます
ただしいくつか注意点があります

  • 対話的にやるのではなくファイルを与えて実行する場合には、拡張子をpyではなくipyにしておかないとIPython特有のマジックコマンドは実行されないみたいです
  • 改行区切りでリストに入れられた結果が返されます(オプションで変更できるみたいですが
  • 日本語の文字列をWindows+IPythonで扱うとエラーを吐いたり文字化けしたりするときがあります
result = !echo コマンドの結果を変数に代入できる | mecab
print result

var = '変数展開もできる'
result = !echo $var | mecab
print result
result = !echo {var + ', 式展開もできる'} | mecab
print result