「BlenderのPythonコンソールで import PIL を実行したら ModuleNotFoundError: No module named 'PIL' になった」「ターミナルで pip install pillow を実行したのに、Blenderの中では相変わらずエラーのまま」「Blender付属のPythonがどこにあるのか分からず、どこにpillowを入れればいいのか見当がつかない」——bpyスクリプトから画像処理をしようとして、こういう詰まりに当たったことはないでしょうか。
原因は単純で、Blenderは自分専用のPython実行環境をアプリ内部に同梱しており、それはOSにインストールされているPythonとは別物だからです。この記事では、原因の確認コマンドと、恒久対策となる2つの解決策(同梱Pythonへの直接インストール/処理の外部プロセスへの切り出し)、どちらを選ぶべきかの判断基準をまとめます。
- BlenderのPythonはOSのPythonと別物。ターミナルでの
pip install pillow はBlenderには届かない - 原因の切り分けは
sys.executable をbpyスクリプト内で出力して確認する - 対策1: Blender同梱Pythonに直接pillowを入れる(同梱Pythonの実体パスに対して
-m pip install) - 対策2: 画像処理だけ別プロセス(システムのpython3)に切り出す
- 無人実行・CI・複数マシン配布では対策2の方が壊れにくい
目次を開く
なぜBlenderの中でpillowが使えないのか
BlenderのTextEditorやスクリプトコンソールから実行されるPythonコードは、OSに apt install python3 や公式インストーラーで入れたPythonではなく、Blenderが内部に同梱している専用のPython実行環境で動きます。pip install pillow をターミナルで実行しても、そのpipが指しているのはOS側のPythonであり、Blender同梱のPython環境には反映されません。これが import PIL が ModuleNotFoundError になる理由です。
まず、今動いているPythonがどちらなのかを確認します。
# BlenderのTextEditorやスクリプトコンソールで実行
import sys
print(sys.executable)
print(sys.version) ここで表示されるパスが /usr/bin/python3 のようなシステムのパスではなく、Blenderのインストールディレクトリ配下(例: .../blender/4.x/python/bin/python3.xx)になっていれば、同梱Pythonで動いていることが確定します。
症状の切り分け
| 症状 | 原因 | 対処 |
|---|---|---|
Blender内のスクリプトでだけ ModuleNotFoundError: No module named 'PIL' | 同梱Pythonにpillow未インストール | 対策1か対策2 |
ターミナルの python3 ではpillowが使えるのに、Blender内では使えない | 実行環境が別物(同梱Pythonとシステムのpython) | 対策1か対策2 |
pip install pillow を何度実行しても変わらない | システム側のpipに対して実行している(Blenderに届いていない) | 対策1 |
対策1: Blender同梱Pythonへ直接pillowを入れる
同梱Pythonの実体パスに対して直接 pip install を実行します。まず、そのパスを調べます。
# Blenderをバックグラウンド起動し、同梱Pythonの実体パスを出力させる(Linux/macOS例)
blender --background --python-expr "import sys; print(sys.executable)" 出力されたパスに対して、pipが使える状態にしてからインストールします。
# 同梱Pythonにpipが入っていない場合は先にensurepipで用意する
/path/to/blender/4.x/python/bin/python3.xx -m ensurepip
/path/to/blender/4.x/python/bin/python3.xx -m pip install pillow Windowsの場合はパス区切りが異なるだけで考え方は同じです。blender.exe --background --python-expr "import sys; print(sys.executable)" で同梱Pythonのパスを確認し、そのパスの python.exe に対して同じく -m pip install pillow を実行します。
この方法の弱点は、Blenderをバージョンアップすると同梱Pythonのディレクトリ名(4.x の部分)も変わるため、更新のたびに入れ直しが必要になる点です。
対策2: 画像処理だけ別プロセス(システムのpython3)に切り出す
Blenderの中で完結させず、pillowに依存する処理(画像の合成・リサイズなど)だけを別のPythonスクリプトに切り出し、subprocess でシステムのpython3を呼び出す方法です。
# Blender側(bpyスクリプト)
import subprocess
subprocess.run(
["python3", "compose_images.py", "--input", "a.png", "b.png", "--output", "merged.png"],
check=True,
) # compose_images.py(システムのpython3で実行される。pillowはこちら側に入れる)
import argparse
from PIL import Image
parser = argparse.ArgumentParser()
parser.add_argument("--input", nargs="+", required=True)
parser.add_argument("--output", required=True)
args = parser.parse_args()
images = [Image.open(p) for p in args.input]
width = sum(img.width for img in images)
height = max(img.height for img in images)
canvas = Image.new("RGBA", (width, height))
x = 0
for img in images:
canvas.paste(img, (x, 0))
x += img.width
canvas.save(args.output) pillowはシステムのpython3側に pip install pillow で入れておくだけで済み、Blender本体には一切手を入れません。
どちらを選ぶか
| 状況 | 推奨 |
|---|---|
| ローカルで数回だけ使う・GUI操作の延長で完結させたい | 対策1(同梱Pythonへ直接インストール) |
| 無人実行・CIパイプラインで動かす | 対策2(別プロセスへ切り出し) |
| Blenderのバージョンを頻繁に更新する | 対策2 |
| 同じスクリプトを複数マシンに配布する | 対策2 |
まとめ
- BlenderのPythonはOSのPythonと別物の同梱環境で、
pip install pillowはそのままでは届かない - 原因の切り分けは
sys.executableの出力で一発で確認できる - 恒久対策は「同梱Pythonに直接インストール」か「処理を外部プロセスへ切り出す」の二択
- 無人実行・CI・複数マシン配布が絡む場合は切り出し方式の方が、Blenderのバージョン更新に振り回されず壊れにくい
よくある質問(FAQ)
pip install pillow を実行してもBlender内でImportErrorのままなのはなぜですか?
それはシステムのpip(ターミナルの python3 -m pip)に対して実行しているためで、Blender同梱のPython環境には届いていません。sys.executable で確認したBlenderの同梱Pythonの実体パスを使い、そのパスに対して -m pip install pillow を実行してください。
Blenderのバージョンを上げたらまたImportErrorが出るようになりました
同梱Pythonのディレクトリはバージョンごとに変わるため、上げるたびにpillowの再インストールが必要になります。この手当てを繰り返したくない場合は、対策2(別プロセスへの切り出し)に切り替えると、Blender本体へのインストール作業自体が不要になります。
Windowsでも同じ手順で大丈夫ですか?
基本的な考え方(同梱Pythonのパスを調べてそこにpipで入れる、または別プロセスに切り出す)はOSを問わず共通です。同梱Pythonのパスを調べるコマンドの書き方だけがOSごとに異なるので、記事内のコマンドを手元の環境に合わせて読み替えてください。
ensurepip を実行しているのはなぜですか?
Blenderの同梱Python環境には、pip自体が最初から使える状態になっていないことがあります。その場合は pip install の前に ensurepip でpipを使えるようにしてから、あらためて pip install pillow を実行します。
