Pythonでコマンドの実行結果の標準出力を取得する
仕事で個人的に使用するコマンドをPythonで書いてみようと思い、Pythonでコマンドを実行してその標準出力を取得する方法を調べた。
$ cat test.py
#!/usr/bin/python
def main():
for line in exec_cmd('ls -l'):
print line
def exec_cmd(cmd):
from subprocess import Popen, PIPE
p = Popen(cmd.split(' '), stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
return [ s for s in out.split('\n') if s ]
if __name__ == '__main__':
main()
subprocess.Popen
を使用する。subprocess.PIPE
は標準ストリームに指定するパイプ。
subprocess.Popen
では、コマンドを配列で表現する必要があるので、コマンドラインを文字列で表記して、それをsplit()
で分割。
p.communicate()
はプロセスと通信し、結果を取得する。返り値は、標準出力、標準エラー出力のタプル(stdout,stderr)
。
調べている過程でp.wait()
を使ってプロセスを実行し、p.stdout.readlines()
で取得する方法を先に見つけたが、デッドロックを起こす可能性があるようで、この方法に変更。ただし、この方法でもデータ量が多い場合は使用すべきでない、という注意が公式のドキュメントにあった。
プロセスを実行後、標準出力の結果を行ごとで分割。空行が含まれていたので、リスト内包表記で空行を除外した。
以下が、出力結果。
$ python test.py
total 16
-rw-r--r-- 1 te2u staff 2878 7 15 23:43 2015-07-15_230419.txt
-rw-r--r-- 1 te2u staff 319 7 15 23:48 test.py
参考
- Python の subprocess で返り値と標準 (エラー) 出力の内容を得る | CUBE SUGAR STORAGE
- pythonでコマンド実行するには - それマグで!
- TOLLE ET LEGE 屋根裏の備忘録 : Pythonで外部コマンドを実行させてその結果を受け取る方法
- Python の subprocess で出力を受け取るときは communicate() を使おう - Qiita
- 17.1. subprocess — サブプロセス管理 — Python 2.7ja1 documentation
- map, reduce, filterによるシーケンス操作 » Python Snippets