夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Blenderで外部Pythonスクリプトを実行する

本日はBlender Python枠です。

昨日PythonOpenCVを用いて画像の姿勢推定を行いました。

今回はBlenderで外部からスクリプトを実行できるか試して行きます。

目的としては単純な興味もありますが、BlenderからBlender環境外のスクリプトを実行してその情報を取得できればいろいろと使いどころがあると思ったためです。

〇環境

・Windows11

・Blender4.0

その他は以前の記事を参照ください

Blenderで外部スクリプトを実行する

単にPythonスクリプトを実行する場合と異なり多くの場合はPythonの仮想環境ごと実行されます。

これを実現するためには実行するPythonスクリプトのほかにPythonインタープリタのパスが必要となります。

import bpy
import os
import subprocess

# 外部Pythonスクリプトのパスを指定します
script_path = r"C:\Users\seiri\Documents\PythonStudy\ComputerVision\pose.py"

# AnacondaのPythonインタープリタのパスを指定します
python_path = r"C:\Users\seiri\anaconda3\python.exe"

# スクリプトが存在するか確認します
if not os.path.exists(script_path):
    print(f"スクリプトが見つかりません: {script_path}")
else:
    # subprocessを使用してスクリプトを実行します
    result = subprocess.run([python_path, script_path], capture_output=True, text=True)

    # 実行結果を表示します
    print(result.stdout)

 今回の場合はAnacondaで作成しているPythonインタープリタ(環境)のパスを指定して実行する必要があります。

 このパスの調べ方はAnaconda Pronptで次のようなコマンドで取得できます。

(base) C:\Users\>conda activate opencv-env #環境の定義

(opencv-env) C:\Users\seiri>where python 

where pythonコマンドはPythonのパスを調べるコマンドになります。

これを実行すると次のようなパスが出力されます。(実際の結果はローカル環境によって変わります。)

C:\Users\(ユーザー名)\anaconda3\envs\opencv-env\python.exe
C:\Users\(ユーザー名)\AppData\Local\Microsoft\WindowsApps\python.exe

Windowsの場合システム全体でpythonがインストールされているすべての場所を返します。

今回の場合はAnaconda環境パスが必要のためC:\Users\(ユーザー名)\anaconda3\envs\opencv-env\python.exeが求めているパスになります。

BlenderPythonを実行します。

これにより外部のPythonスクリプトを実行することができます。

〇出力結果の取得

import bpy
import os
import subprocess

def load_result_image():
   # 画像ファイルのパス
   image_path = r"test.jpg"#任意のパスに変更してください
   
   if not os.path.exists(image_path):
      print(f"画像が見つかりません: {image_path}")
   else:
      # 画像を読み込み
      image = bpy.data.images.load(image_path)
      #マテリアルの作成
      material = bpy.data.materials.new(name="ImageMaterial")

      # マテリアルを使用するノードを作成
      material.use_nodes = True
      for node in material.node_tree.nodes:
       print(node.name)
      bsdf = material.node_tree.nodes["Principled BSDF"]
      
      # テクスチャノードを作成
      tex_image = material.node_tree.nodes.new('ShaderNodeTexImage')
      tex_image.image = image

      # テクスチャノードをBSDFノードに接続
      material.node_tree.links.new(bsdf.inputs['Base Color'], tex_image.outputs['Color'])

      # アクティブなオブジェクトに新しいマテリアルを適用
      obj = bpy.context.active_object
      if obj.data.materials:
         # マテリアルがすでに存在する場合は、最初のマテリアルを置き換え
        obj.data.materials[0] = material
      else:
        # マテリアルが存在しない場合は、新しいマテリアルを追加
        obj.data.materials.append(material)


# 外部Pythonスクリプトのパスを指定
script_path = r"pose.py"#任意のパスに変更してください

# AnacondaのPythonインタープリタのパスを指定します
python_path = r"python.exe"#任意のパスに変更してください

# スクリプトが存在するか確認
if not os.path.exists(script_path):
    print(f"スクリプトが見つかりません: {script_path}")
else:
    # subprocessを使用してスクリプトを実行します
    result = subprocess.run([python_path, script_path], capture_output=True, text=True)
    print(result)
    # 実行結果を表示します
    print(result.stdout)
    load_result_image()#画像のロード

これを実行することで処理後に結果の画像をロードすることができます。

 今回でBlenderで外部のPythonスクリプトを実行して結果を読み込むことができました。

 応用すれば様々な処理がBlenderでできそうです。