我需要从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'
我尝试的另一件事是:
if __name__ == '__main__':
print 'hello world'
但它根本没有执行。
最后,我还尝试将print放在一个方法中,然后调用它:
command = "execfile('%s')" % (fileFullPath)
client.send(command)
data = client.recv(1024)
client.send("exec('start()')")
然后我得到一个名称' start'未定义错误
有人知道为什么会这样,或者至少知道如何避免这种情况?
提前感谢您的帮助。
答案 0 :(得分:1)
您可以通过几种更可预测的方式获得相同的结果。
Maya已经提供了基于TCP的 [command port],它将执行通过网络传入的命令;你不需要编写自己的服务器。您还可以使用更强大的远程解决方案,例如 [RPYC]或[ZeroMQ]。
您在Maya的( '127.0.0.1', 666 )
内运行服务器?这可以解释重复的打印输出。
相关:如何在Maya中设置一个简单服务器以响应来自 over HTTP 的命令,an example。{/ p>
您通常不想使用 execfile()
,如果此代码对您以外的任何人都可见:它是最大的安全漏洞可以想象!
答案 1 :(得分:0)
我找到了解决方案!
正如this回答中所建议的,我只需要将 import maya.cmds作为mc \ n 添加到要执行的命令中:
command = "import maya.cmds as mc\n import maya.cmds as mc\nexecfile('%s')" % (fileFullPath)
现在我想知道为什么这段代码会阻止Maya两次执行脚本。