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がバックグラウンドにフォークしたり、途中で終了したりするような悪い状態ではコンソールを離れ、回りこまれた行を編集すると奇妙な動作が起きることに注意してください。