アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

Blender付属Pythonでpillowがimportできない時の直し方

Featured image of the post

「BlenderのPythonコンソールで import PIL を実行したら ModuleNotFoundError: No module named 'PIL' になった」「ターミナルで pip install pillow を実行したのに、Blenderの中では相変わらずエラーのまま」「Blender付属のPythonがどこにあるのか分からず、どこにpillowを入れればいいのか見当がつかない」——bpyスクリプトから画像処理をしようとして、こういう詰まりに当たったことはないでしょうか。

原因は単純で、Blenderは自分専用のPython実行環境をアプリ内部に同梱しており、それはOSにインストールされているPythonとは別物だからです。この記事では、原因の確認コマンドと、恒久対策となる2つの解決策(同梱Pythonへの直接インストール/処理の外部プロセスへの切り出し)、どちらを選ぶべきかの判断基準をまとめます。

💡
30秒で要点
- 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 を実行します。

プログラミング学習でお悩みですか?

現役エンジニアがあなたの学習をマンツーマンでサポートします。

  • 学習の進め方がわからない
  • ポートフォリオの作り方を知りたい
  • 現場で使える技術を学びたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら