この記事はTakumi Akashiro ひとり Advent Calendar 2020の23日目の記事です。
始めに
以前Houdiniを触った際、外部のPythonからHoudiniのhou
オブジェクトを操作するhrpyc
モジュールが凄いなあ……1とおもったので、
hrpyc
を参考にして、Mayaで同じようなものが書けないかなあと思ったので作ってみました。
rpycモジュールとは
Remote Python Call、すなわち別のプロセスのPythonのオブジェクトを使うためのモジュールです。2
呼び出し元はサーバーを立て、呼び出し先にネットワーク経由でオブジェクトのプロキシを提供することで別セッションのPythonのオブジェクトを使えます。
詳細はrpyc · PyPIに任せますが、Houdiniで使うhrpycはrpycを非常に簡素にしたラッパーです。
使い方
-
pip install rpyc -t <mayaのScriptフォルダ>
でrpycをインストールする。
バイナリは無いのでpython2系なら何でも大丈夫……なはず。 - 以下のファイルをMayaのScriptフォルダを保存。
#! python2
# encoding: utf-8
import threading
from rpyc.utils import classic
from rpyc.core import SlaveService
from rpyc.utils.server import ThreadedServer
PORT = 18812
def _start_server(port=PORT):
t = ThreadedServer(
SlaveService,
hostname = '0.0.0.0', port = int(port),
reuse_addr = True, authenticator = None,
registrar = None, auto_register = False
)
t.start()
def start_server(port=PORT):
thread = threading.Thread(target=lambda: _start_server(port))
thread.start()
return thread
def import_remote_maya_module(server="127.0.0.1", port=PORT):
return classic.connect(server, port).modules['maya']
3.MayaのScriptEditorなどで以下を実行してMayaのサーバーを立てる。
import mrpyc
mrpyc.start_server()
4.外部のインタプリタで以下を実行して、mayaモジュールを取得して、polyCubeを作ってみます。
import mrpyc
maya = mrpyc.import_remote_maya_module()
maya.cmds.polyCube()
締め
以外と簡単3にできましたね!
ただ実験した感じ、数分経つと接続が死んだり、Mayaがクラッシュしたりするので、
もうちょっとhrpyc
の_RemoteHouAttrWrapper
を参考にして実装すると安全にできるのかもしれないです。