3
3

More than 3 years have passed since last update.

pythonで外部コマンドを実行する(結果を受け取る/受け取らない場合の両方)

Last updated at Posted at 2020-12-18

python3, MacOSとLinuxで動作確認済み。

import os
import subprocess


def exec_os_system(cmd: str):
    '''
    コマンドを同期実行し、
    標準出力と標準エラー出力は、実行したプロンプトに随時表示する
    戻り値はコマンドのリターンコード
    '''
    # os.systemはwaitで子プロセスの終了を待つため、リターンコードの上位8bitにリターンコードが格納される
    # それを取るため8bit右にシフトする
    # see http://d.hatena.ne.jp/perlcodesample/20090415/1240762619
    rt = os.system(cmd) >> 8
    return rt


def exec_subprocess(cmd: str, raise_error=True):
    '''
    コマンドを同期実行し、
    標準出力と標準エラー出力は最後にまとめて返却する
    raise_errorがTrueかつリターンコードが0以外の場合は例外を出す
    戻り値は3値のタプルで (標準出力(bytes型), 標準エラー出力(bytes型), リターンコード(int))
    '''
    child = subprocess.Popen(cmd, shell=True,
                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = child.communicate()
    rt = child.returncode
    if rt != 0 and raise_error:
        raise Exception(f"command return code is not 0. got {rt}. stderr = {stderr}")

    return stdout, stderr, rt


if __name__ == "__main__":
    exec_os_system("date")

    stdout, stderr, rt = exec_subprocess("date")
    print(stdout)
    print(stderr)
    print(rt)


実行結果

Fri Dec 18 16:04:49 JST 2020
b'Fri Dec 18 16:04:49 JST 2020\n'
b''
0
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3