本日はPython枠です。
現在少しづつblenderアドオンを開発していますが、外部ライブラリの扱いで難航しており、ソースコードを含め配付する形を検討しています。
対象のライブラリをバインドすることはできましたが、配付されているライブラリの依存関係も同じようにローカルに含める必要があります。
この時に問題となるのがすでにBlenderプロジェクトのPythonにインストールされている依存ライブラリ以外をローカルに含める必要があるということです。
これは競合を避ける意味もありますが、配付するパッケージサイズを下げることにもつながります。
〇ライブラリの依存関係の確認
通常ライブラリのソースコードに含まれるrequirements.txt
に依存ライブラリが記述されています。
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と表示されたパッケージを別途バンドルすることで依存関係が解消されます。
本日は以上です。