作業ノート

様々なまとめ、雑感など

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

参考