夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Pythonで現在のプロジェクトにあるライブラリがインストールされているかどうかを調べるPythonコード

本日はPython枠です。

現在少しづつblenderアドオンを開発していますが、外部ライブラリの扱いで難航しており、ソースコードを含め配付する形を検討しています。

 対象のライブラリをバインドすることはできましたが、配付されているライブラリの依存関係も同じようにローカルに含める必要があります。

 この時に問題となるのがすでにBlenderプロジェクトのPythonにインストールされている依存ライブラリ以外をローカルに含める必要があるということです。

 これは競合を避ける意味もありますが、配付するパッケージサイズを下げることにもつながります。

〇ライブラリの依存関係の確認

通常ライブラリのソースコードに含まれるrequirements.txtに依存ライブラリが記述されています。

github.com

music21の場合は以下になります。

chardet

joblib

jsonpickle

matplotlib

more_itertools

numpy

webcolors>=1.5

requests

この中で例えばnumpyなどは広く使用されているPythonライブラリでもあり、すでに他のパッケージなどの導入の際に導入されている可能性が高いといえます。

 Anacondaなどで環境構築から始める場合はpip install時に競合してインストールされないようになっておりますが、BlenderなどはPython環境がアプリケーションとセットで導入されており、複雑です。

 こういった場合にどのモジュールがすでに入っているかを確認することは非常に大切になります。

〇コード

今回はMusic21の依存パッケージを例にみて行きます。

packages = ["chardet", "joblib", "jsonpickle", "matplotlib", "more_itertools", "numpy", "webcolors", "requests"]

for package in packages:
    try:
        __import__(package)
        print(f"{package} is available")
    except ImportError:
        print(f"{package} is not available")

ここでは最初にpackagesの中で配列を定義し、for文の中でモジュールの状況を検索しています。

具体的には import(package)で指定したモジュールを一つずつ動的にインストールし、失敗した場合はImportErrorを返すようにしています。

実行すると次のようにコンソールを確認することができます。

chardet is not available
joblib is not available
jsonpickle is not available
matplotlib is not available
more_itertools is not available
numpy is available
webcolors is not available
requests is available

ここではnumpyとrequests以外のモジュールが足りないことを意味しています。

ここでnot availableと表示されたパッケージを別途バンドルすることで依存関係が解消されます。

本日は以上です。