2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

複数パッケージを使用する時の注意事項

2
Posted at

はじめに

概要

この記事は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管理をしていることをは少ないとは思いますが、何か参考になれば幸いです。

それでは、しゃーした~。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?