組み込み開発のためのPython · レッスン 219 / 220
subprocessで外部ツールを安全に呼び出す
引数配列、タイムアウト、戻り値を使ってビルド・診断ツールと連携します。
Pythonからコンパイラーや診断コマンドを実行すると、試験の前後処理を自動化できます。ユーザー入力をシェル文字列へ連結せず、コマンドと引数を分けて渡します。
シェル文字列の連結を避ける
`subprocess.run`へ実行ファイルと引数のリストを渡す方法は、空白や特殊文字を含むパスを安全に扱いやすくします。`shell=True`に外部入力を混ぜると、意図しないコマンド実行につながる可能性があります。必要性を厳しく確認し、入力を適切に制限します。
失敗・タイムアウト・出力を確認する
子プロセスの終了コードを確認し、標準出力と標準エラー出力を区別します。長時間動く処理にはタイムアウトを設け、タイムアウト後に子プロセスがどうなるかを確認します。ログにトークンや秘密のパスが含まれないようにし、実行権限を最小限にします。
コード例
手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。
import subprocess
result = subprocess.run(
["python", "-m", "unittest", "discover"],
check=False,
capture_output=True,
text=True,
timeout=30,
)
print(result.stdout)
if result.returncode != 0:
raise RuntimeError(f"テスト失敗: {result.stderr.strip()}")手を動かす課題
存在しないコマンド、失敗するテスト、タイムアウトする子プロセスをそれぞれ試し、終了理由を区別しましょう。