はじめに
概要
この記事はHoudini アドベントカレンダー2025 20日目の記事です。
Houdiniの環境整理を複数Packageで行うときに大変だったことなどを紹介できればと思います。
環境
Houdini20.5.410 Py3.11
そもそもpackageとは?
昨年のアドベントカレンダーで以下記事を書きましたので、こちらを参考にしてください。
packageファイルを使って自前環境を整えよう!
普段の運用
起動用バッチで$HOUDINI_PACKAGE_DIRを設定して、そこの中のPackagesたちを読みに行く。
PackagesFolderには複数のPackagesのJSONファイルがあり、そこでは別フォルダで管理しているpackageのパスだけ仕込んである形になります。
こうすることでBatchの更新無しでPackageの更新が可能なので、このような運用をしていました。
フォルダ構成でまとめるとこんなかんじです。(root以下のフォルダは独立しているので、実際は別の場所で管理しています。)
またPackage.jsonの場所を示しているだけなので、実際の設定ツール群は別のところにでまとめています。
.
└── root/
├── packageFolder/
│ ├── common_package_path.json
│ └── project_package_path.json
├── commonPackages/
│ ├── common_package.json
│ └── dl_package.json
├── projectPackages/
│ ├── project_package.json
│ └── project_sub_package_path.json
└── projectSubPackages/
└── project_sub_package.json
普段はこのような感じでPackageの管理をしていたところ、とある問題が発生しました。
汎用Packagesの中の123.pyが読み込まれない。
起動時のPythonが読み込まれる場所とその順番
起動時には以下のPythonスクリプトが読み込まれます。
pythonrc.py
ready.py
uiready.py
123.py
Python スクリプトの場所
※readyとuireadyはあんまり使用しないので、割愛します。
ちなみにotls(HDA)を読み込む前に呼び出せるのがpythonrc.pyだけなので、自分はこのファイルを多用しています。
pythonrc.pyと123.pyは以下のフォルダにある時に起動します。
pythonX.Ylibs/pythonrc.py
script/python/pythonrc.py
script/123.py
pythonrc.pyは2か所で起動することが出来て、起動順は①pythonX.Ylibs②script/pythonの順で読み込まれます。混乱の元なので、場所はある程度統一しておいた方が安全です。
ここで問題なのが123.pyは最初に合致したPathのものだけ読み込まれるという仕様です。
問題の原因は汎用Packageの中の123.pyより先に別の場所の123.pyが起動してしまったということです。
複数のPackageが読み込まれる順番
ここからは実際のケースごとの呼び出し順番に関して説明していきます。
大原則としてhpathが後から設定されたものから順番に処理されていきます。
①Packageが1つの場合
こちらはhpathが後から設定されたものから順に処理が進みます。
例えば
{
"hpath": ["$ROOT_PATH/testA","$ROOT_PATH/testB"]
}
となっている場合はtestBのフォルダの方が後に設定されているので、testBの123.pyが起動します。
②1つのフォルダに複数のPackagesが仕込まれている場合
こちらも後から設定されたものといえばそうなのですが、
例えば
{
"hpath": ["$ROOT_PATH/testA"]
}
{
"hpath": ["$ROOT_PATH/testB"]
}
となっている場合、何も設定していないとアルファベット順で読み込まれるので、
root_A.json
root_B.json
みたいな名前にしているとBの方があとから呼び出されるので、Bの方の123.pyが読み込まれます。
これを回避するためにpackageの中にprocess_orderを設定することで
{
"hpath": ["$ROOT_PATH/testA"],
"process_order":2
}
{
"hpath": ["$ROOT_PATH/testB"],
"process_order":1
}
このようにしておくとB→Aの順番で呼び出されるので、Aの方の123.pyが読み込まれることになります。
ちなみにprocess_orderを設定しない場合、自動で99が割り振られるため、一番最後に呼び出されることになります。
③複数フォルダに複数のPackagesが仕込まれている場合
同一フォルダに
{
"hpath": ["$ROOT_PATH/testA"],
"process_order":2
}
{
"hpath": ["$ROOT_PATH/testB"],
"package_path": ["$P_ROOT_PATH/testC/packages"],
"process_order":1
}
別フォルダに
{
"hpath": ["$ROOT_PATH/testC"]
}
となっている場合、Packageの読み込みはフォルダ毎に行われるため、今回の場合だとB→A→Cの順で呼び出されでCの123.pyが読み込まれます。ちなみに最初の問題はこれが原因でした。
こうなると、Cより後にAを呼び出すことは不可能なので、深い階層での参照をやめるか、設定したいもの以外の123.pyの使用をやめるかの2択になると思います。
おまけ
この設計を上手く使用する方法も実はあります。
例えば
{
"hpath": [
"$ROOT_PATH/common",
{"$PRJ_STEP == 'PRI'" : "$ROOT_PATH/testA"},
{"$PRJ_STEP == 'SEC'" : "$ROOT_PATH/testB"},
{"$PRJ_STEP == 'LTG'" : "$ROOT_PATH/testC"},
{"$PRJ_STEP == 'CMP'" : "$ROOT_PATH/testD"},]
}
このようにPackageを仕込んでおけばBatchで任意の環境変数を設定することで、step毎に初期UIや起動時の初期シーンの切り替えに使用できたり、CMPでは別の123.pyを使用して、それ以外の工程ではcommonの123.pyを起動させることが可能です。
まとめ
123.pyは設計を考えて運用しましょう。別タイミングの実行でOKなのであればpythonrc.pyやready.pyで代用するのもアリだと思います。
おわりに
ここまで複雑なPackage管理をしていることをは少ないとは思いますが、何か参考になれば幸いです。
それでは、しゃーした~。