1

我需要从用 Maya 编写的外部软件向 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'

但是,当我执行此操作时,'hello world' 在 Maya 中打印了两次。

我尝试的另一件事是:

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

但它根本不执行。

最后,我还尝试将打印放在一个方法中并像这样调用它:

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

但后来我得到一个名称“开始”未定义错误

有人知道为什么会发生这种情况,或者至少知道如何避免这种情况?

在此先感谢您的帮助。

4

2 回答 2

1

您可以通过几种更可预测的方式获得相同的结果。

Maya 已经提供了一个基于 TCP 的[command port ],它将执行通过网络传入的命令;您不需要编写自己的服务器。您还可以使用更强大的远程解决方案,例如[ RPYC ][ ZeroMQ ]

您是在Maya( '127.0.0.1', 666 ) 内部运行服务器吗?这将解释重复的打印输出。

相关:是如何在 Maya 中设置简单服务器以响应来自HTTP的命令示例

您通常不想使用execfile(),如果此代码对您以外的任何人都可见:这是可以想象的最大安全漏洞!

于 2016-12-03T18:41:29.337 回答
0

我找到了解决办法!

正如这个答案中所建议的,我只需要将import maya.cmds as mc\n添加到要执行的命令中:

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

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

于 2016-12-01T12:57:10.553 回答