2016-12-01 11 views
1

Mayaで書かれた外部ソフトウェアからスクリプトをMayaに送信する必要があります。私は小さな例でこれを実行しようとしました:私はこの、「こんにちは世界」を実行するときexecfileで送信するとPythonスクリプトがAutodesk Mayaで2回実行される

print 'hello world' 

Hovewerを、Mayaで二回出力されます。hello_world.pyで

import socket 
import time 
from os.path import abspath 

ADDR=('127.0.0.1',666) 


def execute_file(fileFullPath): 
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    client.connect(ADDR) 
    command = "execfile('%s')" % (fileFullPath) 
    client.send(command) 
    data = client.recv(1024) 
    print data 
    client.close() 
    time.sleep(.1) 
    return data 

if __name__ == '__main__': 
    py_file = 'hello_world.py' 
    py_file = abspath(py_file) 
    execute_file(py_file) 

は私が持っています。

私が試したもう一つは、次のとおりです。

if __name__ == '__main__': 
    print 'hello world' 

しかし、それがすべてで実行されません。

は最後に、私はまた、この方法でプリントを入れて、このようにそれを呼び出すことで試してみました:

command = "execfile('%s')" % (fileFullPath) 
client.send(command) 
data = client.recv(1024) 
client.send("exec('start()')") 

をしかし、私は名「スタート」を取得定義されていないエラー

誰かがなぜこれが起こるか知っていますか、あるいは私がこれを避ける方法について少なくとも考えを持っていますか?

ご協力いただきありがとうございます。

答えて

1

予測可能な方法で同じ結果を得ることができます。

Mayaは既にTCPベースの [command port]を提供しています。これはネットワーク経由でコマンドを実行します。独自のサーバーを作成する必要はありません。 [RPYC]または[ZeroMQ]のようなより堅牢なリモートソリューションを使用することもできます。

あなたは内('127.0.0.1', 666)でサーバーを実行していたあなたのマヤ?それは重複した印刷物を説明するでしょう。

関連項目:でのコマンドに応答するために、Mayaの内部に簡単なサーバーを設定する方法のan exampleです。

あなたは、一般的に、このコードは、自分以外の誰にも表示されます場合は、execfile()を使用したくない:それは想像最大のセキュリティホールです!

+0

あなたの答えをありがとう。それは素晴らしいようです。今私はインフルエンザに罹っていますが、すぐに私はもっと見ることができ、あなたが提案するものが私のために働くかどうかを見ます。とにかく、私はあなたに(+共同体)知らせるでしょう。 – DarkPurpleShadow

0

解決策が見つかりました。

thisの回答で示唆したように、私はちょうど実行するコマンドにMCの\ nはとして輸入maya.cmdsを追加する必要がありました:

command = "import maya.cmds as mc\n import maya.cmds as mc\nexecfile('%s')" % (fileFullPath) 

今私は、コード防止のなぜこの作品を知っているのが大好きですスクリプトを2度実行するMaya。

関連する問題