以下の内容はhttps://redhologerbera.hatenablog.com/entry/2024/08/13/232212より取得しました。


Pythonでローカルディレクトリからライブラリを読み込む

本日はPython枠です。

 今回はPythonでローカルディレクトリ内にあるライブラリを読み込んでいきます。

 通常自分自身の環境でnumpyなどPythonの外部ライブラリを使用したい場合は仮想環境を構築してpip installで導入します。

 しかし場合によっては環境ごと配布する必要があることなどがあります。

 例えば筆者の開発しているBlenderのアドオンなどではmusic21のライブラリを使用しますが、これを配布するためには配布パッケージ内にmusic21のライブラリを配置しておく必要があります。

〇環境

・Windows11PC

・music21

VSCode

〇ライブラリの取得

今回はmusic21のライブラリを取得します。

music21はMITが主体となってOSSの形で提供されているソフトウェアです。

そのリポジトリは以下にになります。

github.com

リソースからv9のmusic21のソースコードを取得しました。

github.com

取得したファイルは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モジュールのソースコードをダウンロードします。

pypi.org

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の依存関係が解消されローカルディレクトリからライブラリを読み込むことができます。

本日は以上です。




以上の内容はhttps://redhologerbera.hatenablog.com/entry/2024/08/13/232212より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14