1. ホーム
  2. python

[解決済み] サブプロセスコールから終了コードと標準エラーコードを取得する

2023-06-19 23:42:49

質問

サブプロセスが提供するcall、check_call、check_outputの各機能について読み、それぞれの動作や機能の違いについて理解しました。 現在、stdoutにアクセスできるようにcheck_outputを使用し、以下のように例外をキャッチするために"try block"を使用しています。

# "cmnd" is a string that contains the command along with it's arguments. 
try:
    cmnd_output = check_output(cmnd, stderr=STDOUT, shell=True, timeout=3, universal_newlines=True);                         
except CalledProcessError:                                                                                                   
    print("Status : FAIL")                                                                                                   
print("Output: \n{}\n".format(cmnd_output))                                                                                  

私が遭遇している問題は、例外がスローされたときに、"cmnd_output" が初期化されず、stderr にアクセスできず、以下のエラーメッセージが表示されることです。

print("Output: \n{}\n".format(cmnd_output))
UnboundLocalError: local variable 'cmnd_output' referenced before assignment

例外が発生すると、tryブロック内で"check_output"がそれ以上の処理、つまり"cmnd_output"への割り当てをせずにすぐにベイルするからだと思います。 間違っていたら訂正してください。

私はstderr(stoutに送信される場合は大丈夫です)にアクセスし、終了コードにアクセスすることができる方法はありますか。私は、例外をスルーすることなく、終了コードに基づいて手動で合格/失敗をチェックすることができます。

ありがとうございました。 Ahmedです。

どのように解決するのですか?

このバージョンを試してみてください。

import subprocess
try:
    output = subprocess.check_output(
        cmnd, stderr=subprocess.STDOUT, shell=True, timeout=3,
        universal_newlines=True)
except subprocess.CalledProcessError as exc:
    print("Status : FAIL", exc.returncode, exc.output)
else:
    print("Output: \n{}\n".format(output))

このようにすると、呼び出しが成功した場合のみ出力が表示されます。 の場合は CalledProcessError の場合、リターンコードと出力を表示します。