概要
pythonでsubprocessを使って処理を行なった後,標準出力を文字列として受け取りたいことがあります.
ちょくちょく行う処理なのですが,いつもどうやるのか忘れるのでメモしておきます.
version
python3.9.2
(python3.7以降は同じ)
やり方
subprocessの実行は最近(python3.5以降)では公式ドキュメントによるとsubprocess.run
を使うのが良いみたいです.
一発で標準出力を文字列として受け取るには以下のようにします.
>>> import subprocess
>>> output_str = subprocess.run('ls', capture_output=True, text=True).stdout
('ls'
は実行したいコマンドの例です.)
その結果,
>>> print(output_str)
'Dockerfile\nLICENSE\nREADME.md\nsrc\n'
>>> print(type(output_str))
<class 'str'>
標準出力を文字列として受け取ることができています!
capture_output=True
で出力が受け取れるようになり,
text=True
を渡すことで出力をバイナリではなく文字列として返してくれるようになります.
さらにsubprocess.run
はCompletedProcess
というクラスを返すのですが,
そのクラスの変数であるstdout
にアクセスすることで標準出力を受け取っています.
>>> subprocess.run('ls', capture_output=True, text=True)
CompletedProcess(args='ls', returncode=0, stdout='Dockerfile\nDockerfile:cpu\nDockerfile:cuda10.2-cudnn7\nLICENSE\nREADME.md\ndata\nresult\nsrc\ntrained_model.npz\n', stderr='')
標準エラー出力や戻り値にアクセスしたい場合はそれぞれstderr
, returncode
にアクセスすれば良いです.