螺旋階段を一歩ずつ

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

subprocessモジュールでリダイレクト(>, >>)を実現する

昨日の記事 では、単純に標準出力をファイルへ書き出した。しかし、ターミナルで同じことをしたい場合はリダイレクト( > , >> )を使うのが普通だと思う。

$ gmt --version > sample.txt
$ gmt --version >> sample.txt
リダイレクトとは
シェル・スクリプト・リファレンス - 【 リダイレクトとは 】:ITpro

ならばということで、Pythonでリダイレクトを処理できるようにする。前回と同様にして

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

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

>>> import shlex
>>> shlex.split('ls -a >> a.txt')
['ls', '-a', '>>', 'a.txt']
>>> shlex.split('gmt --version > sample.txt')
['gmt', '--version', '>', 'sample.txt']

このように取り出せた > , >> を検出してやればいい。ただし、スペースが無いとダメ。

>>> shlex.split('gmt --version >sample.txt')
['gmt', '--version', '>sample.txt']

なので、きちんとエラーを検出してやる。

 if '>' in script_list:
     # Writing mode
 elif '>>' in script_list:
     # Appending mode
 elif ('>' in script) or ('>>' in script):
     raise ScriptRunningError("Please insert a space before and after"
                              " the redirect $ %s" % str(script))

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

コード

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

エラーはこんな感じにとれる。

Traceback (most recent call last):
  File "gmt_subprocess_redirect.py", line 54, in <module>
    runScript(script)
  File "gmt_subprocess_redirect.py", line 37, in runScript
    " the redirect $ %s" % str(script))
__main__.ScriptRunningError: Please insert a space before and after the redirect $ gmt --version >sample.txt