subprocess.Popen()でタイムアウトした時の標準出力stdoutと標準エラーstderrは常にb""になるのでしょうか。
次のようにコードを書きました。
Windows用のソースコードです。Linuxだとdecode("utf8")に変えたりする必要があると思います。
内容としては、コマンドを実行して、指定秒後にタイムアウトします。(実行してみた感じ多分できているはず。)
Python
1import subprocess 2 3def mypopen(cmd, shell, time): 4 outs = b"" 5 errs = b"" 6 7 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=shell) 8 9 try: 10 #proc.wait(timeout=time) 11 outs, errs = proc.communicate(timeout = time) 12 except subprocess.TimeoutExpired as e: 13 print(type(e)) 14 print(e) 15 proc.kill() 16 outs, errs = proc.communicate() # 常に (b"", b"") なら、この処理は不要になる 17 18 outs = outs.decode("cp932") 19 errs = errs.decode("cp932") 20 21 return outs, errs 22 23if __name__ == "__main__": 24 cmd = r"dir \192.168.99.99\share" # 時間がかかりそうな処理(2回目以降はタイムアウトしないっぽい?) 25 ret = mypopen(cmd, shell=True, time=3) 26 print(ret)
タイムアウトの例外に引っかかった場合は、
<class 'subprocess.TimeoutExpired'> Command 'dir \192.168.99.98\share' timed out after 3 seconds ('', '')
と表示され、タイムアウトに引っかからなかった場合は、
('', 'ネットワーク パスが見つかりません。\r\n')
だけが表示されました。
タイムアウトした際は
標準出力stdoutと標準エラーstderrは常にb""で合ってますか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/31 19:01
2021/08/01 04:15