Houdini

Houdini の Python 環境構築 ② パッケージにパスを通す

下記の記事の続きです。

前回はバッチファイルを利用して下記のような環境を構築しました。

今回は Houdini パッケージを作り、それにパスを通していきます。
Python パッケージを内包する、Python パッケージとは別のものです。

Houdini パッケージ

Houdini パッケージとは

前回はバッチファイルの中で環境を作りました。
まとめの部分でもお話したんですが、私は基本的にこの方法を使っていません。

前回は環境をバッチファイルで行っていますが、Houdini パッケージは環境を別のディレクトリで管理するものです。

パッケージは複雑な環境構築に対応するために行います。
必要な環境がひとつだけの場合だと使うメリットは薄いです。

下記のどれかに当たる場合はパッケージでの運用を考えてみてもいいかもしれません。

環境の取捨選択

例えば私の場合だと、

  • 会社で制作を行う際に利用する環境
  • Stale Diffusion など機械学習を Houdini で利用する環境
  • 検証用の環境

といった具合に複数の環境を利用しています。
また、複数案件を跨いで仕事をする場合はさらに増えますし、
機械学習も1種類ではなく数種類の環境があります。

前回 2つの Python パッケージを通した際の bat ファイルの中身が下記です。

@echo off

set VERSION=19.0.657
set EXE="C:\Program Files\Side Effects Software\Houdini %VERSION%\bin\houdini.exe"

set HOUDINI_MENU_PATH=D:/launch-test-2/menu-test;@
set PYTHONPATH=D:/launch-test-2/python-test-A;D:/launch-test-2/python-test-B

start "" %EXE%

python- test-A と python-test-B を作っていますが、これに様々な環境変数を設定しようと思った場合はバッチ ファイル内が複雑化していき、test-A のみ利用したい場合 / test-B のみ利用したい場合の切り分けがややこしくなっていきます。

パッケージはこの問題を解決し、簡単に環境を切り替えて Houdini を起動できるようになります。

環境の共有

環境をチームで共有する場合にも有効です。

パッケージを Git などで共有しておき、バッチファイル内で必要なものを取捨選択できます。

Houdini パッケージをつくる

今回も完成したデータを置いておきます。

バッチファイルの Houdini のバージョンだけ変更が必要です。
データの全体像は下記のようになっています。

MainMenuCommon.xml と check_param は前回の記事をご確認ください。

まずは package-A の環境だけ構築していきます。

パッケージの全体像

パッケージは次のように構築します。

バッチファイルのコード

パッケージの環境変数は $HOUDINI_PACKAGE_DIR です。

完成データを DL されている方は launch-A.bat のファイルに書かれています。

@echo off

set VERSION=19.0.657
set EXE="C:\Program Files\Side Effects Software\Houdini %VERSION%\bin\houdini.exe"

set HOUDINI_PACKAGE_DIR=D:/package-test-1/package-A;

start "" %EXE%

$HOUDINI_PACKAGE_DIR を package-A に繋げています。

$HOUDINI_PACKAGE_DIR にパスを通した場合、Houdini は起動時に $HOUDINI_PACKAGE_DIR の直下を探索し、json ファイルを探します。

このとき、json ファイルは通したパスの直下に置いておく必要があります。
サブディレクトリまでは探索しません

Houdini は直下にある json ファイルを環境変数などが記載されたファイルと認識して読みます。

package.json

json ファイルは環境変数をキー、パスや値を辞書の値として記載します。

{	
	"env" : [
		{ "HOUDINI_MENU_PATH" : "D:\\package-test-1\\package-A\\menu-A" },
		{ "PYTHONPATH" : "D:\\package-test-1\\package-A\\python-A" }
	]
}

上記のコードは下記の部分にあたります。
同じ要領で他の環境変数も設定できます。

バッチファイルとパッケージの json ファイルが正しければ、バッチファイルから起動することでメニューが追加されます。

バッチファイルと $HOUDINI_PACKAGE_DIR を利用することでバッチファイルの外で環境を構築できました。

パッケージ内で複数の値を利用する

複数の値を設定したい場合には下記のように値をリストにして書きます。

{	
	"env" : [
		{ "HOUDINI_MENU_PATH" : "D:\\package-test-1\\package-A\\menu-A" },
		{ "PYTHONPATH" : 
			[
				"D:\\package-test-1\\package-A\\python-A" ,
				"D:\\package-test-1\\package-B\\python-B"
			]
		}
	]
}

これで起動すると python-B にもパスが通ります。

import os
print(os.environ['PYTHONPATH'])

上記のコードで確認すると下記のように出力されます。

D:/package-test-1/package-B/python-B;D:/package-test-1/package-A/python-A

下記のコードで実行もできます。

import print_hello
import importlib
importlib.reload(print_hello)

package-B にはメニューも用意していますが、表示はされません。
今回通しているのが $PYTHONPATH だけなので、Python パッケージのパスは通っていますが python-B のメニューにはパスが通っておらず、表示されないのが正常です。

複数のパッケージを併用する

HOUDINI_PACKAGE_DIR に複数のパスを通すには「 ; 」(セミコロン)で繋げます。

完成データを DL されている方は launch-AB.bat のファイルに書かれています。

@echo off

set VERSION=19.0.657
set EXE="C:\Program Files\Side Effects Software\Houdini %VERSION%\bin\houdini.exe"

set HOUDINI_PACKAGE_DIR=D:/package-test-1/package-A;D:/package-test-1/package-B;

start "" %EXE%

package-A / package-B 両方にパスが通るため、両方のメニューが追加されます。

パッケージを利用することで、
バッチファイルで環境の取捨選択ができるようになります。

パッケージをパッケージで切り替える

今回パッケージ パッケージ うるさいですが、ここではパッケージをパッケージで切り替えていきます。

パッケージをパッケージ内に入れることでパッケージのパスを通すかどうかをパッケージの json ファイルで制御できます。

完成データが下記です。

データの内容は下図です。
ややこしそうなんで、依存関係を矢印で書いておきました。

パッケージの中にパッケージが入っています。

bool 値で切り替える

パッケージに enable キーを追加することでそのパッケージを有効にするかどうかを制御できます。

パッケージからパッケージへパスを通すには package_path キーで通します。

package-A.json | パスが通る

{    
    "package_path":"D:\\package-test-2\\package-A\\package-dir-A",
    "enable":true
}

package-B.json | パスが通らない

{    
    "package_path":"D:\\package-test-2\\package-B\\package-dir-B",
    "enable":false
}

Houdini のバージョンで切り替える

package-19.0.json | Houdini 19.0 で起動した場合にパスが通る

{    
    "package_path" : {
        "houdini_version == '19.0'": "D:\\package-test-2\\package-2\\package-19.0"
    }
}

package-19.5.json | Houdini 19.0 より上のバージョンで起動した場合にパスが通る

{    
    "package_path" : {
        "houdini_version => '19.5'": "D:\\package-test-2\\package-2\\package-19.5"
    }
}

バージョンを指定する際の符号は Pyhon と同じです。 and も使えます。
詳しくは公式ページを参照してください。

まとめ

Houdini パッケージは様々な環境をまとめて管理できます。
特に Houdini は Maya と違ってバージョンによる差がちゃんとあるので、起動する Houdini のバージョンによる分岐はよく行います。
例えば複数の案件が走ってて、同じツールを複数案件で使いたい、だけどHoudini のバージョンの違いでエラーがでる時とかですね。


Houdini パッケージには他にもいろいろな機能があります。詳しくは公式ページを参考にしてください。

色々と多機能で私は全ては把握できていませんが、パッケージに関してはこの記事の内容くらいカバーしておけば特に困らないのではないでしょうか。

また、パッケージは $HSITE からも通せます。
$HSITE > Houdini x.x > packages の中に同様に json ファイルを配置して通します。

より自由度の高い環境を目指す場合は HSITE から作ると便利です。

HSITE であれば HSITE 側で Houdini のバージョンで分岐します。

-Houdini