search
LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

rpycモジュールを使って外部のPythonインタプリタからMayaを操作する

この記事は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を非常に簡素にしたラッパーです。

使い方

  1. pip install rpyc -t <mayaのScriptフォルダ> でrpycをインストールする。
    バイナリは無いのでpython2系なら何でも大丈夫……なはず。
  2. 以下のファイルをMayaのScriptフォルダを保存。
mrpyc.py
#! 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()

image.png

23_01.gif

締め

以外と簡単3にできましたね!

ただ実験した感じ、数分経つと接続が死んだり、Mayaがクラッシュしたりするので、
もうちょっとhrpyc_RemoteHouAttrWrapperを参考にして実装すると安全にできるのかもしれないです。


  1. 凄いなあって思うだけで実際に使ったことは無いですが。 

  2. 諸説ある 

  3. 自分が触った感じだとhrpyc.pyから余分な部分を削ってつくることで、3時間程度で出来た。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0