Houdini 17.0 Pythonスクリプト

コマンドラインスクリプト

On this page

標準のPythonシェルからhouにアクセスする

標準のPythonシェルで単純にhouモジュールをインポートすれば、簡単にHoudiniを既存のPythonベースのスクリプトに統合することができます。最初にhouをインポートしてしまえば、PythonはHoudiniのライブラリすべてを読み込み、空っぽのHoudiniセッションを初期化します。houモジュールは、実際上Houdiniセッションを保存し、hipファイルからそのセッションを読み込み、スクリプトからそのファイルを検査し、そのセッション内のノード間で情報を入出力します。

houモジュールをインポートするには、Pythonが$HFS/houdini/python2.7libsでPythonモジュールを検索するように設定する必要があります。それを設定する方法の1つが、Pythonを起動する前にPYTHONPATH環境変数に、このパスを追加します。他の方法では、Python内でsys.pathに、このパスを追加します。以下のPythonのスニペットは、source houdini_setup$HFSとパスを設定していることを前提に、houモジュールを標準のPythonシェルにインポートしています。

Note

source houdini_setupを実行しない場合、手動でHFS環境変数を設定しなければなりません。また、Windowsでは、$HFS/binの値をPATH環境変数に追加しなければなりません。

houモジュールをインポートする時、通常のHoudini初期化スクリプトである123.cmd/123.pyと456.cmd/456.pyは実行されません。 それらのスクリプトを実行したいのであれば、明示的にhou.__runUserDefinedCode()をコールしなければなりません。

#!/usr/bin/python
def enableHouModule():
    '''"import hou"が動作するように、環境をセットアップします。'''
    import sys, os

    # houをインポートすることで、Houdiniのライブラリが読み込まれ、Houdiniが初期化されます。
    # そして、HoudiniはC++で記述されたHDK拡張を読み込みます。
    # それらの拡張は、Houdiniのライブラリに対してリンクさせる必要があるので、Houdiniのライブラリのシンボルが、
    # Houdiniが読み込む他のライブラリから見えている必要があります。
    # そのため、houをインポートする前に、Pythonのdlopenフラグを調整します。
    if hasattr(sys, "setdlopenflags"):
        old_dlopen_flags = sys.getdlopenflags()
        import DLFCN
        sys.setdlopenflags(old_dlopen_flags | DLFCN.RTLD_GLOBAL)

    try:
        import hou
    except ImportError:
        # Pythonがhouモジュールを検索できるように、
        # sys.pathに`$HFS/houdini/python2.7libs`を追加します。
        sys.path.append(os.environ['HFS'] + "/houdini/python%d.%dlibs" % sys.version_info[:2])
        import hou
    finally:
        if hasattr(sys, "setdlopenflags"):
            sys.setdlopenflags(old_dlopen_flags)

enableHouModule()
import hou

# 123.cmd/pyや456.cmd/pyの初期化スクリプトを実行させたいのであれば、以下の行のコメントを外します。そうすればhouが読み込まれます。
# hou.__runUserDefinedCode()

ライセンス付与

houモジュールをインポートする時は、Pythonはライセンスをチェックします。 デフォルトでは、PythonはHoudini Batchライセンスを使用し、BatchライセンスがなければHoudini FXライセンスを使用します。Pythonが使用するHoudiniライセンスを指定したい場合は、houモジュールをインポートする前にHOUDINI_SCRIPT_LICENSE変数をhescapeに設定します。Pythonスクリプトから、この変数を設定するには、os.environ['HOUDINI_SCRIPT_LICENSE'] = 'hescape'を記述します。

デフォルトでは、houモジュールはPythonインタプリタが終了するまでHoudiniのライセンスを返しません。しかし、Pythonスクリプトを長時間実行して、すぐにライセンスを取得して解放したい場合は、houモジュールを使い終わった時にhou.releaseLicense()をコールすることができます。houモジュールはコールされた時点でライセンスを取得します。HoudiniのセッションデータとライブラリはPythonが終了するまでメモリからアンロードされないことに注意してください。

houモジュールは、PythonやHoudiniでインポートされると、$HOUDINI_PATH内のディレクトリをループします。そして、見つかったディレクトリ名に"/python2.7libs"を足してsys.pathに追加します。さらに上位互換用に$HOUDINI_PATHはディレクトリ名に"/scripts/python"を足して検索されます。例えば、$HOME/houdiniX.Y/python2.7libsにPythonモジュールを配置すれば、houをインポートした後にPython検索パスにそのパスが追加されます。

hython

HythonはHoudiniと一緒に入っているPythonシェルで、標準のPythonシェルと以下の点で少し異なります:

  • Hythonは自動的に$HFS/houdini/python2.7libsをsys.pathに追加し、Hythonを起動するとhouモジュールをインポートします。

  • コマンドライン上で.hipファイルを渡して、それを読み込むことができます。

  • Tab補完をサポートしています。2回Tabを押すと補完リストが表示されます(LinuxとMac)。

  • インタラクティブシェルでHScriptコマンド名の前に%を付けることでHScriptコマンドを実行することができます。

  • -bオプションでHythonを起動して、コンソール入力を待ちながら、openportコマンドを受け取って、それを操作することができます。

デフォルトでは、Hythonはバックグラウンドではopenportソケットに送られたコマンドをリッスンせずに実行しません。しかし、-bオプションを使えば、可能になります。openportイベントをリッスンしている時、Hythonは、標準のPythonとは違う仕組みを使ってコマンドラインの入力を読み込みます。この他の仕組みは、Hythonがバックグラウンドにフォークしたり、途中で終了したりするような悪い状態ではコンソールを離れ、回りこまれた行を編集すると奇妙な動作が起きることに注意してください。

Pythonスクリプト

はじめよう

次のステップ

Pythonビューアステート

Pythonでビューアステートを記述することで、ビューポート内でノードのユーザー操作をカスタマイズすることができます。

導師レベル

リファレンス

  • hou

    Houdiniにアクセスできるサブモジュール、クラス、ファンクションを含んだモジュール。

  • Alembic拡張関数

    Alembicファイルから情報を抽出するための便利な関数です。