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