こんにちは。
本日はPythonメモです。
概要
subprocessモジュールは標準ライブラリです。
このモジュールを使用することで
外部コマンドやプログラムを実行することができます。
本記事では、以下のディレクトリ構成を準備して試します。
tmp └ hoge.txt
サンプルコード
subprocess.runは引数に指定したコマンドを同期で実行します。
戻り値は、CompletedProcessオブジェクトです。
import subprocess result = subprocess.run(['ls', './tmp'], capture_output=True) print(result) print(f'arge = {result.args}') print(f'returncode = {result.returncode}') print(f'stdout = {result.stdout}') print(f'stderr = {result.stderr}')
実行結果は以下のようになります。
CompletedProcess(args=['ls', './tmp'], returncode=0, stdout=b'hoge.txt\n', stderr=b'') arge = ['ls', './tmp'] returncode = 0 stdout = b'hoge.txt\n' stderr = b''
stdoutとstderrに関しては、バイト列となります。
subprocess.runの引数、textをTrueにすることで
テキストモードで取得することができます。
import subprocess result = subprocess.run(['ls', './tmp'], capture_output=True, text=True) print(result) print(f'arge = {result.args}') print(f'returncode = {result.returncode}') print(f'stdout = {result.stdout}') print(f'stderr = {result.stderr}')
実行結果は以下のようになります。
CompletedProcess(args=['ls', './tmp'], returncode=0, stdout=b'hoge.txt\n', stderr=b'') arge = ['ls', './tmp'] returncode = 0 stdout = hoge.txt stderr =
引数 shellについての注意
shell=Trueとすることで、文字列で直接指定して
シェル経由でコマンドを実行することができます。
import subprocess result = subprocess.run('ls ./tmp', capture_output=True, shell=True)
shell=True、便利ですが注意点もあります。
シェルインジェクション攻撃に対して脆弱になる可能性があるという点です。
固定のコマンドを実行するのではなく、外部からの入力を直接設定するような場合は
別の方法を検討するほうがいいでしょう。
以上です。