本日はPython枠です。
今回はPythonでローカルディレクトリ内にあるライブラリを読み込んでいきます。
通常自分自身の環境でnumpyなどPythonの外部ライブラリを使用したい場合は仮想環境を構築してpip installで導入します。
しかし場合によっては環境ごと配布する必要があることなどがあります。
例えば筆者の開発しているBlenderのアドオンなどではmusic21のライブラリを使用しますが、これを配布するためには配布パッケージ内にmusic21のライブラリを配置しておく必要があります。
〇環境
・Windows11PC
・music21
〇ライブラリの取得
今回はmusic21のライブラリを取得します。
music21はMITが主体となってOSSの形で提供されているソフトウェアです。
そのリポジトリは以下にになります。
リソースからv9のmusic21のソースコードを取得しました。
取得したファイルはzip形式でDLされます。これを自身のPythonコードと同じ階層にフォルダごと配置します。

以上で配布パッケージの中に対象のライブラリを含ませることができました。
〇ローカル環境からモジュールを読む
配布ファイルの中にライブラリを入れただけではモジュールとして読み込まれません。
Pythonコード側でディレクトリから読み込むようにコードを描きます。
import os
import sys
current_dir = os.path.dirname(__file__)
music21_module_path = os.path.abspath(os.path.join(current_dir, "music21"))
sys.path.insert(0, music21_module_path)
try:
import music21
print("Successfully imported music21")
except ImportError as e:
print(f"Failed to import music21: {e}")
肝となるのは次の3行です。
current_dir = os.path.dirname(__file__)
music21_module_path = os.path.abspath(os.path.join(current_dir, "music21"))
sys.path.insert(0, music21_module_path)
ここでは現在のPythonコードがあるディレクトリを取得して、そのパスにmusic21というライブラリ名を合体させその中にある__init__.pyを読み取ってモジュールとして認識させる処理です。
これを実行すると次のようなエラーがコンソールに出力されました。
Failed to import music21: No module named 'requests'
これはmusic21モジュールがrequestsモジュールを必要としているため、requestsがインストールされていないことが原因でインポートに失敗しています。
この問題を解決するには、requestsモジュールをインストールする必要があります。
このように依存関係のパッケージも導入する必要があります。
まずはrequestsモジュールのソースコードをダウンロードします。

2つのモジュールを読み込めるように以下のようにコードを書き換えます。
import os
import sys
current_dir = os.path.dirname(__file__)
module_paths = ["music21", "requests"]
for module in module_paths:
module_path = os.path.abspath(os.path.join(current_dir, module))
sys.path.insert(0, module_path)
# music21をインポートしてテスト
try:
import music21
print("Successfully imported music21")
except ImportError as e:
print(f"Failed to import music21: {e}")
しかし次のモジュールが求められます。
Failed to import music21: No module named 'urllib3'
同様に"urllib3", "chardet", "idna", "certifi"のモジュールも導入することでmusic21の依存関係が解消されローカルディレクトリからライブラリを読み込むことができます。
本日は以上です。