subprocessモジュールでリダイレクト(>, >>)を実現する
昨日の記事 では、単純に標準出力をファイルへ書き出した。しかし、ターミナルで同じことをしたい場合はリダイレクト( > , >> )を使うのが普通だと思う。
$ gmt --version > sample.txt
$ gmt --version >> sample.txt
ならばということで、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