Houdini 20.0 Pythonスクリプト

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

On this page

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

標準のPythonシェル内でhouモジュールをインポートすることで、HoudiniをPythonスクリプトに統合することができます。 初回でhouをインポートすると、PythonはHoudiniのライブラリすべてをロードし、空っぽのHoudiniセッションを初期化します。 houモジュールは実質的にHoudiniセッションを保存していて、hipファイルをそのセッションにロードし、スクリプトからそのファイルを評価し、 そのセッション内で情報とノードを入出力させることができます。

houモジュールをインポートできるようにするには、まず最初に$HFS/houdini/pythonX.Ylibs内のPythonモジュールを検索するようにPythonに指示する必要があります。 これは、Pythonを起動する前にPYTHONPATH環境変数にそのパスを追加するか、または、Python内でsys.pathにそのパスを追加することで行なうことができます。

Tip

$HHP環境変数は、$HFS/houdini/pythonX.Ylibsを指した便利変数です。 sourceコマンドでhoudini_setupスクリプトを実行した時に設定されます。

以下のPythonスニペットは、標準のPythonシェルにhouモジュールをインポートします。 このスニペットは、事前にsourceコマンドによるhoudini_setupスクリプトの実行が済んでいることを前提にしています。

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

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

    # Windowsのみ。
    # PythonがhouモジュールのHoudiniライブラリ依存ファイルを認識できるように、DLL検索パスに%HFS%/binを追加します。
    # os.add_dll_directory()は古いバージョンのPythonには存在しないことに注意してください。
    # 代わりに、Python3.7ユーザは、Pythonを起動する前に、PATH環境変数に%HFS%/binを追加する必要があります。
    if sys.platform == "win32" and hasattr(os, "add_dll_directory"):
        os.add_dll_directory("{}/bin".format(os.environ["HFS"]))

    try:
        import hou
    except ImportError:
        # houモジュールをインポートできなかった場合に
        # Pythonがhouモジュールを検索できるようにするために
        # sys.pathに`$HFS/houdini/pythonX.Ylibs`を追加します。
        sys.path.append(os.environ['HHP'])
        import hou
    finally:
        # dlopenフラグを元の値に戻ります。
        if hasattr(sys, "setdlopenflags"):
            sys.setdlopenflags(old_dlopen_flags)

enableHouModule()
import hou

Note

source houdini_setupを実行しない場合、手動でHFS環境変数とHHP環境変数を設定しなければなりません。

Note

Windowsの場合、houモジュールをインポートする前にos.add_dll_directory()をコールして、DLL検索パスに%HFS%/binを追加しなければなりません。 これによって、PythonはhouモジュールのHoudiniライブラリ依存ファイルを認識することができます。

Python3.7では、os.add_dll_directory()は存在しません。 代わりに、Pythonを起動する前に、PATH環境変数に%HFS%/binを追加してください。

Note

houモジュールをインポートすると、Houdini初期化スクリプトの123.cmd/123.py456.cmd/456.pyが走ります。

Note

Linuxの場合、JE Mallocの設定に関する警告に遭遇する場合があります。 JE Mallocは、Houdinのオペレーションのメモリパフォーマンスの改善に役立ちます。

JE Mallocを設定するには、Pythonを起動する前にjemallocライブラリをロードします。例:

LD_PRELOAD="$HFS/dsolib/libjemalloc.so" python

他の方法として、houモジュールをインポートする前にHOUDINI_DISABLE_JEMALLOCTEST=1環境変数を設定することで、 JE Malloc警告を無効にすることができます。

Note

Mac OSでは、houモジュールをインポートした時に“symbol not found(シンボルが見つかりません)”のエラーに遭遇する場合があります。 その場合、Pythonを起動する前にDYLD_INSERT_LIBRARIES環境変数を設定することで、houモジュールがインポートされる前にHoudiniライブラリを事前にロードさせることができます。例:

export DYLD_INSERT_LIBRARIES=/Applications/Houdini/HoudiniX.Y.ZZZ/Current/Version/Houdini

ライセンス付与

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内のディレクトリをループします。そして、見つかったディレクトリ名に/scripts/pythonを足してsys.pathに追加します。例えば、$HOUDINI_USER_PREF_DIR/scripts/pythonにPythonモジュールを配置すれば、houをインポートした後にPython検索パスにそのパスが追加されます。

hython

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

  • Hythonは自動的に$HHPsys.pathに追加し、Hythonを起動するとhouモジュールをインポートします。

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

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

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

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

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

Pythonスクリプト

はじめよう

次のステップ

リファレンス

  • hou

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

導師レベル

Python Viewerステート

Pythonビューアハンドル

プラグインタイプ