リモートからの MEL コマンド実行

リモートからの実行方法

Maya上でポートを開くことによって、Maya 以外のプロセスから MEL コマンドを実行できるようになります。

commandPort

Maya 上で外部から接続するポートを開くには maya.cmds.commandPort() を使用します。

(使用例)

maya.cmds.commandPort()
引数無しで関数を実行するとデフォールトで /tmp/mayaCommand に UNIX ドメインソケットが作られます。(Linux)
maya.cmds.commandPort(name='myMayaCommand')
/tmp/myMayaCommand に UNIX ドメインソケットを作ります。
maya.cmds.commandPort(name=':8888')
Tcp ポート 8888 番にソケットを作ります。

commandPort のフラグ

close=boolean (cl)
ポートを閉じます。
name=string (n)
作成するドメイン ソケット・ポートの名前を指定します。
noreturn=boolean (nr)
実行したコマンドからの結果をスクリプトエディタ(Script Editor)のヒストリウィンドウに表示します。
returnNumCommands=boolean (rnc)
コマンドを実行しないで、実行されたコマンドの数を返します。
noreturn フラグを指定すると、このフラグは無視されます。
prefix=string (pre)
送られたデータを、コマンド string の引数として実行します。
echoOutput=boolean (eo)
すべてのコマンド出力をコマンド ポートに送信します。
securityWarning=boolean (sw)
コマンド ポートの入力のセキュリティ警告を有効化します。
bufferSize=int (bs)
Maya との通信に使用するバッファ サイズを指定します。
デフォルト バッファ サイズは、4096 バイトです。

ポート番号について

ネットワーク上でデータを送信するには、あるアドレス(IPアドレス)のパソコンなどのホストで、 開いているポート(TCPポート)にデータを送ります。
ポートを表すポート番号は、0〜65535までのありますが、 以下のような種類に分けられます。

0〜1024
WELL KNOWN (一般的なポート番号)
普通は変更しません。
1025〜49151
REGISTERED (登録済みポート番号)
アプリケーションで使用します。
49152〜65535
DYNAMIC AND/OR PRIVATE PORTS (自由に使用できるポート番号)
ユーザが自由に使用できます。

Mayaで、MELコマンドを受け取るためのポートを開くには、 WELL KNOWN以外の現在使用されていないポート番号を使用する必要があります。
通常は、1024 より大きい、空いている番号を使用します。

実行例 (Linux)

以下に、Linux においてローカルホストのポート8888番を使用した、スクリプト例をあげておきます。

  1. 以下のPythonスクリプトを rmc.py というファイル名で保存します。
    import socket
    import sys
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('localhost', 8888)) 
    
    com = sys.stdin.read()
    com = com.replace('\n', '')
    sock.send(com)
    s = sock.recv(4096)
    print(s)
    
  2. Mayaを起動し、スクリプトエディタのPythonタブで以下の関数を実行します。
    import maya.cmds
    maya.cmds.commandPort(name=':8888')
  3. MEL コマンドを rmc.py を通して Maya に送って実行させます。
    シェル上で、以下のコマンドを実行します。
    % echo sphere | python rmc.py
    nurbsSphere1 makeNurbSphere1
  4. Maya のシーンに NURBS の球体が作成されます。
    rmc によって作られた球

スクリプトの解説

import socket
socket モジュールをインポートします。
TCP/IP によって通信するために必要です。
import sys
sys モジュールをインポートします。
MEL コマンドを読み込むために必要です。
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ソケットを開きます。
socket.AF_INET
IPv4プロトコルを表します。
アドレスの指定を (ホスト名, ポート番号) の形で行ないます。
socket.SOCK_STREAM
接続を、TCPのバイトストリーム指向によって行ないます。
sock.connect(('localhost', 8888))
ソケットを、ローカルホスト(localhost)の 8888 番ポートに接続します。
com = sys.stdin.read()
標準入力からデータを読み込みます。
この場合のデータは、MELコマンドである必要があります。
com = com.replace('\n', '')
データ中の改行('\n')を取り除きます。
こうしないと、プロシージャなどが正しく実行されません。
sock.send(com)
ソケットにデータを送ります。
s = sock.recv(4096)
MayaからMELコマンドを実行した結果を受け取り、文字列 s に代入します。
受け取るデータの大きさは最大 4096 バイトです。
print(s)
結果を表示します。

Windowsにおける注意

Windowsでは、ファイアウォールによって、ポートへのデータ送信がブロックされていることがあります。 その場合は、 コントロールパネル → セキュリティセンター → Windows ファイアウォール ウィンドウで 有効 にチェックを入れて、 例外タブで、Mayaを追加してください。(Windows XP)

参考


Prev
Home | Contents
Mail