Pythonで外部プログラムをあつかう時、実行前に外部プログラムが存在するか確認したかったので調べました。
実行時エラーチェックもできますが、その前に利用可能なことだけ確認したいような場合を想定しています。
または、プログラムのインストールされているパスを調べたいときにも使えます。
外部プログラムはsubprocess.Popen
などで実行する前提です。
Pythonのバージョンは3.5.1と2.7.11で試しました。
たぶん一番簡単な方法(Python3.3以上)
shutilモジュールのwhich関数を使います。
コマンドが実行可能であればコマンドへパスを、見つからなければNone
を返します。
import shutil
print(shutil.which('ls')) # > '/bin/ls'
print(shutil.which('ssss')) # > None
Python3.3未満の使用を強いられている人たちへの救済
shutil.which
はバックポートされていないのでPython 2.7では使えません。
さっさと3.5以上に移行したほうがいいと思いますが、無理な人もいると思うので、古いPythonでも使える方法を紹介します。
distutils.spawn.find_executable
でshutil.which
と同じことができます。
http://stackoverflow.com/questions/5226958/which-equivalent-function-in-python
import distutils.spawn
print(distutils.span.find_executabl('ls')) # > '/bin/ls'
print(distutils.span.find_executabl('ssss')) # > None
これは知らないと見つからないのでは・・・
3系でもこの方法は使えますが、distutilsはマイナー扱いされてドキュメントもなくなっていました。
http://docs.python.jp/3/library/distutils.html
罠ポイントは
-
shutil
は単数形だけどdistutils
は複数形 -
import distutils
だけだとspawn
モジュールがインポートされないのでimport distuils.spawn
またはfrom distutils import spawn
する必要がある
などです。