なんだかGoodVibes

日々の勉強メモです。

【Python】subprocess.runを使用してコマンドを実行する

こんにちは。
本日は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、便利ですが注意点もあります。
シェルインジェクション攻撃に対して脆弱になる可能性があるという点です。
固定のコマンドを実行するのではなく、外部からの入力を直接設定するような場合は
別の方法を検討するほうがいいでしょう。



以上です。