BlenderPythonで外部モジュールをImportする方法

# （結論）忙しい人のために

下記の`package_name`を必要なモジュール名に変更して、管理者としてコマンドを実行するとBlenderPythonにモジュールをインストールすることができます。
```Bash
"C:/Program Files/Blender Foundation/Blender 4.1/4.1/python/bin/python.exe" -m pip install package_name
```

# BlenderPythonの仕様

### 標準ライブラリの一覧を取得

まず初めに、BlenderPythonと一般的なPythonの標準ライブラリに違があるかどうかを調べるために、以下のコードをそれぞれの環境で実行し、その差を調べました。

```python
import sys

mod_bl = sys.modules.keys()
print(mod_bl)
```

### 標準ライブラリの違い

今回は特に、一般的なPythonの環境には含まれていて、BlenderPythonには含まれていない標準ライブラリを調べることを前提に、比較したところ、以下のような結果となりました。

|モジュール|機能 (ChatGPTによる回答)|
|---|---|
|_codecs_jp|Pythonの内部で使用されるコーデック（文字コード変換用のエンコーダとデコーダ）の1つです。特に、日本語の文字コードに関連するコーデックを提供します。|
|_multibytecodec|Pythonの内部で使用されるマルチバイト文字列のエンコーディングとデコーディングに関するコーデックを提供します。これには、多くのアジア圏の言語で使われる文字コードへの対応も含まれます。|
|encodings.cp932|Windowsで一般的に使用される文字コードであるCP932（またはShift-JIS）に関するエンコーディングとデコーディングを提供するコーデックです。日本語のテキストファイルなど、CP932でエンコードされたデータを扱う際に使用されます。|
|pywin32_system32|PythonでWindowsシステムの機能にアクセスするためのモジュールです。このモジュールには、Windowsのシステム関連の機能やAPIにアクセスするための関数が含まれています。|
|pywin32_bootstrap|pywin32パッケージの一部であり、Windows上のPythonでWin32 APIへのアクセスを提供します。これにより、Windowsシステムとの相互作用やシステムレベルのタスクをPythonから実行することができます。|

実行の結果、主に文字コード関係のモジュールがBlenderには含まれていないことが分かりました。実際にBlenderPythonは日本語の入力に対応しておらず、使用できる文字コードが限定されていることが関係しているかもしれません。一方で、`sys`、`os`などのよく使用されるモジュールはBlenderPythonでも使用できることが分かります。

# BlenderPythonで外部モジュールをimport

上記の実験で、通常のPythonとBlenderPythonでは標準ライブラリに大きな違いはないことが分かりました。ここでは、標準では含まれていないライブラリをBlenderPythonにimportする方法を紹介します。通常のPythonでは、`python pip insatll`でインストールを行っていますが、BlenderPythonの実行ファイルを環境変数に登録していないため、この方法ではBlenderPythonに変更を反映させることはできません。パスを環境変数に登録する方法も考えられますが、通常のPythonと競合する可能性があるため現実的ではありません。そこで、BlenderPythonのインタープリターの実行可能なファイルを直接指定することで実現します。

```Bash
"C:/Program Files/Blender Foundation/Blender 4.1/4.1/python/bin/python.exe" -m pip install package_name --no-warn-script-location
```
※コマンドプロンプトで実行する場合は、管理者としてコマンドプロンプトを起動して実行してください。
※"package_name"の部分を必要なモジュール名に変更して実行してください。
※バージョンによってはディレクトリのパスが異なる可能性があります。`Program Files/Blender///python.exe`のように`python.exe`ファイルを環境に合わせて指定してください。

# モジュールの動作確認

次に、実際に上記の方法でモジュールをインポートして、正しく動作することを確認します。今回は、Blenderとの相性が良さそうな`OpenCV`をインポートして実行確認します。

### OpenCVのインストール
```Bash
"C:/Program Files/Blender Foundation/Blender 4.1/4.1/python/bin/python.exe" -m pip install opencv-python --no-warn-script-location
```

### 画像の読み込みと表示
下記のプログラムをBlenderのスクリプトに記述し実行します。
```py
import cv2

# 画像の読み込み
img = cv2.imread('C:/Users/cat.jpg')

# 画像の確認
cv2.imshow('Preview',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

### 実行結果（インストール前）
以下の画像のように、パッケージをインストールしていない状態で実行すると`No module named 'cv2'`のようにエラーが表示されます。

![run_result1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760542/fda289fb-420f-45bb-cc13-90ece0ac0c27.png)


### 実行結果（インストール後）
`OpenCV`のパッケージを上記のコマンドを実行してインストールした後に実行すると、正しく動作することを確認できました。

![run_result2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760542/780aa7e8-8e30-29f2-f2cc-b8730c92652d.png)


# モジュールの削除

BlenderPythonで正しく動作しなかった場合に備えて、インストールしたファイルを削除する方法を提示しておきます。以下のコマンドを管理者として実行してください。

```bash
"C:/Program Files/Blender Foundation/Blender 4.1/4.1/python/bin/python.exe" -m pip uninstall package_name
```
※`Program Files/Blender///python.exe`のように`python.exe`ファイルを環境に合わせて指定してください。
※"package_name"の部分を適当なモジュール名に変更して実行してください。

# 参考

https://docs.python.org/ja/3/installing/index.html

https://udemy.benesse.co.jp/development/python-work/opencv.html

https://allmaintenance.jp/webdirection/programing/python/python%E3%81%A7%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/