2016-12-01 42 views
1

我需要从Maya中编写的外部软件向脚本发送一个脚本。我试着用一个小例子来做到这一点:与execfile一起发送时,Python脚本在Autodesk Maya中运行两次

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) 

在hello_world.py我:

print 'hello world' 

Hovewer,当我执行这一点,“世界你好”在玛雅印两次。

我想另一件事是:

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)服务器内您的玛雅?这将解释重复的打印输出。

相关:是an example如何在Maya中设置一个简单的服务器来响应来自HTTP的的命令。

你一般不希望使用execfile(),如果这个代码将是比你自己以外的任何人可见:它是最大的安全漏洞想象!

+0

感谢您的回答。看起来不错。现在我患了流感,但尽快我可以仔细观察,看看你的建议是否适合我。无论如何,我会让你(+社区)知道。 – DarkPurpleShadow

0

我找到了解决方案!

正如this回答表明,我不得不进口maya.cmds作为MC \ n添加到要执行的命令:

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

现在我很想知道为什么这段代码阻止Maya执行脚本两次。