仕事で使うプログラムを複数人で使えるようにしたいと思いました。しかし、初めて使う人にいちいちモジュールをインストールしてもらうのは面倒かと思います。
そこで今回は、プログラム実行前に必要なライブラリがインストールされているかを判定し、インストールされていなければ自動でインストールするプログラムを作りました。
動作環境:Windows11 64ビット Python 3.12.0
サンプルコードです。
import importlib.util
import subprocess as sp
module_list = ['glob', 'openpyxl', 'dateutil']
def check_module_installed(module_name):
spec = importlib.util.find_spec(module_name)
return spec not None
script = ['pip', 'install']
for m in module_list:
if check_module_installed(m):
script.append(m)
sp.run(script) #シェルを使用する場合はオプションでshell = Trueを追記
今回使用するモジュールはimportlibとsubprocessです。
どちらも標準モジュールなのでインストールの必要はありません。
具体的な内容はこちら
目次
- モジュールがインストールされているかの確認
- インストールされていないモジュールをインストール
モジュールがインストールされているかの確認
モジュールがインストールされているかの確認はimportlibのfind_spec()メソッドを使います。
使い方は、引数にモジュールの名前を指定するだけです。
import importlib.util
importlib.util.find_spec('Numpy') #引数にライブラリ、モジュールの名前を指定
そのモジュールがインストールされている場合はモジュールの名前、インストールされている場所などの情報を返します。
インストールされていない場合はNoneを返します。
そこで、以下のような関数を作ることで、インストールされているかどうかをブール値で判断できます。
def check_module_installed(module_name):
spec = importlib.util.find_spec(module_name)
return spec is None
インストールされていないときはspec = Noneとなり、関数はTrueを返します。
インストールされていない場合にFalseを返したい場合は返り値をspec is not Noneに書き換えてください。
インストールされていないモジュールをインストール
インストールされていないモジュールがわかったので、あとはインストールするだけです。
使うのはsubprocessモジュールのrun()メソッドです。
引数にターミナルで実行したいコマンドを指定するだけなのでお手軽です。
Numpyをインストールしたい場合には以下のように書くだけです。
import subprocess as sp
sp.run(['pip', 'install', 'Numpy'])
コマンドに引数を指定する場合はrun()の引数をリストで指定します。
今回は、まず定型文としてpip installをリストで作っておき、インストールされていないモジュールの名前をリストに追加する方法を取ります。
module_list = ['scipy', 'openpyxl', 'dateutil']
non_module = []
script = ['pip', 'install']
for m in module_list:
if check_module_installed(m):
script.append(m)
print(script)
#['pip', 'install', 'scipy']
私の場合はScipyがインストールされていないことがわかります。
print(script)を以下のようにsp.run(script)に書き換えれば、ターミナルでpip install モジュール名が実行されて、モジュールがインストールされます。
module_list = ['scipy', 'openpyxl', 'dateutil']
non_module = []
script = ['pip', 'install']
for m in module_list:
if check_module_installed(m):
script.append(m)
sp.run(script) #シェルを使用する場合はオプションでshell = Trueを追記
おわりに
いかがだったでしょうか。
このコードをファイルの一番うえに書いておけば、プログラムを不特定多数の人が使う場合に大変便利かと思います。
ぜひ活用してください。
まだまだ勉強中ですので、よりよい方法があれば教えていただけると幸いです。
コメントを残す