螺旋階段を一歩ずつ

研究のタネから趣味のネタまで

subprocessモジュールの標準出力をファイルへ書き出す

Pythonからシェルコマンドをたたくなら、サブプロセス管理の subprocess モジュールを使うことが推奨されているようです。今回は、走らせたコマンドの標準出力をファイルへ書き出します。コマンドには、UNIXコマンドだけではなく環境変数(PATH)として登録されたコマンド(例えば、 treegmt )も使えるようにします。以下で扱うモジュールは、すべてPython標準ライブラリに含まれています。

  • ターミナル上で入力するコマンドをそのままPythonで処理

    コマンドをshlexで単純なリストに成形してsubprocessへ渡す

>>> import shlex
>>> shlex.split('ls -a')
['ls', '-a']
>>> shlex.split('gmt --version')
['gmt', '--version']
>>> shlex.split('wkpdf --source http://www.apple.com --output apple.pdf')
['wkpdf', '--source', 'http://www.apple.com', '--output', 'apple.pdf']
  • 環境変数を引き継いで、ターミナル上で走るコマンドはすべてPythonで処理

    環境変数をos.environとしてsubprocessへ渡す

subprocess.Popen(..., env=os.environ, ...)
  • 標準出力はファイルオブジェクトで受け取る

    with構文にします

output_file = 'sample.txt'
with open(output_file, 'w') as f:
    subprocess.Popen(..., stdout=f, ...)

以上をまとめて、こんな感じになりました。

コード

$ python --version
Python 2.7.3 --  64-bit

proc.communicate() を使うことで、データ量が多い場合に対応しています。

参考にしました

subprocess – プロセスを生成して連携する - Python Module of the Week

Python の subprocess で出力を受け取るときは communicate() を使おう - Qiita