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.py
と456.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は自動的に
$HHP
をsys.path
に追加し、Hythonを起動するとhou
モジュールをインポートします。 -
コマンドライン上で.hipファイルを渡して、それを読み込むことができます。
-
Tab補完をサポートしています。2回Tabを押すと補完リストが表示されます(LinuxとMac)。
-
インタラクティブシェルでHScriptコマンド名の前に
%
を付けることでHScriptコマンドを実行することができます。 -
-b
オプションでHythonを起動して、コンソール入力を待ちながら、openportコマンドを受け取って、それを操作することができます。
デフォルトでは、Hythonはバックグラウンドではopenportソケットをリッスンせず、送られたコマンドを実行しません。しかし、-b
オプションを使えば、可能になります。openportイベントのリッスン時、Hythonは、標準のPythonとは違う仕組みでコマンドライン入力を読み込みます。この別の仕組みは、Hythonがバックグラウンドにフォークしたり途中で終了したりした場合、コンソールを悪い状態のままにし、回りこまれた行を編集すると奇妙な動作が起きる可能性があることに注意してください。