pythonのsubprocessを使うときのtips

August 22, 2023
tag icon
python
tag icon
exiftool

pythonで外部のコマンドを実行する機能のsubprocessを使う時に少しハマったのでtipsとして紹介します。

tips1:subprocess.run()に入れるコマンドの書き方がわからない時

subprocess.run()の引数に入れる適切な配列をどうやって書けばいいのかわからない場合があります(いろんなオプションを指定したい場合など)。

その時はコマンドの文字列を作って、その文字列をshlex.split()に代入すると、適切な配列を返してくれます。

import shlex
import subprocess

command = 'echo "Hello World"'
args = shlex.split(command)
print(args)
# ['echo', 'Hello World']

subprocess.run(args)
# Hello World

tips2:shlex.split()でWindowsのパスが壊れる場合

tips1で紹介したコマンドshlex.split()の文字列にWindowsのバックスラッシュを入れたパスを入力すると、Windowsのパスが壊れてしまいます(バックスラッシュが無くなってしまう)。

実はWindowsの場合はsubprocess.run()に通常のコマンドプロンプトで打ち込む文字列をそのまま入れてOKです(=shlex.split()は使わない)。

POSIX系(Mac、linux)の場合、subprocess.run()はpopenを裏で呼んでいるため、そのままの文字列を(配列の1番目の要素に)渡すとファイル名がおかしいというエラーになるのですが、Windowsの場合はsubprocess.run()は裏で文字列結合してそのままcmdを呼んでいるため、問題なく動作します。

import os 
import shlex
import subprocess

command = 'echo "Hello World"'

if os.name == "nt":
    subprocess.run(command)
else:
    subprocess.run(shlex.split(command))
# Hello World

参考

そして、いい感じにStackOverflowなどの情報をまとめて教えてくれたBingのAIチャットに感謝!


Profile picture

i氏 システムのデザインが好きな自称システムアーキテクト。データサイエンティスト見習い。Jamstackのアーキテクチャーに感動して、Gatsbyでブログを始めました。