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
参考
- https://docs.python.org/3/library/subprocess.html
- https://docs.python.org/3/library/shlex.html
- https://stackoverflow.com/questions/33560364/python-windows-parsing-command-lines-with-shlex
そして、いい感じにStackOverflowなどの情報をまとめて教えてくれたBingのAIチャットに感謝!