我正在尝试编写一个python脚本,执行时将在另一台计算机中打开一个Maya文件并在那里创建它的playblast。这可能吗?另外,我想补充一点,我使用的系统都是Windows。谢谢
答案 0 :(得分:1)
为了在远程计算机上执行某些操作,您必须在那里运行某种服务。
如果是linux机器,只需通过ssh连接并运行命令即可。在python中,你可以使用paramiko:
来做到这一点import paramiko
ssh = paramiko.SSHClient()
ssh.connect('127.0.0.1', username='foo', password='bar')
stdin, stdout, stderr = ssh.exec_command("echo hello")
否则,您可以使用python服务,但您必须事先运行它。 您可以像前面提到的那样使用Celery,或ZeroMQ,或者更简单地使用RPyC:
只需在目标计算机上运行rpyc_classic.py
脚本,然后就可以在其上运行python:
conn = rpyc.classic.connect("my_remote_server")
conn.modules.os.system('echo foo')
或者,您可以创建自定义RPyC服务(请参阅文档)。
最后一个选项是使用像之前建议的HTTP服务器。如果您不想开始安装所有内容,这可能是最简单的。您可以在python中使用Bottle这是一个简单的HTTP框架:
服务器端:
from bottle import route, run
@route('/run_maya')
def index(name):
# Do whatever
return 'kay'
run(host='localhost', port=8080)
客户端:
import requests
requests.get('http://remote_server/run_maya')
答案 1 :(得分:1)
是的,有可能,我会在几台电脑上一直这样做。首先,您需要访问计算机。这已得到回答。然后从shell中调用maya,如下所示:
maya -command myblast -file filetoblast.ma
您需要在脚本路径中的某处 myblast.mel
myblast.mel:
global proc myblast(){
playblast -widthHeight 1920 1080 -percent 100
-fmt "movie" -v 0 -f (`file -q -sn`+".avi");
evalDeferred("quit -f");
}
在此文件中配置您需要的内容,例如着色选项等。请注意调用Maya GUI会占用一个许可证,而playblast需要该GUI(您可以通过不使用默认GUI来节省几秒钟)
答案 2 :(得分:0)
廉价rpc的最后一个选项是从maya python运行maya.standalone(“mayapy”,通常安装在maya二进制文件旁边)。独立版将在常规python脚本中运行,因此它可以使用KimiNewts答案中的任何远程过程技巧。
您还可以使用基本的python创建自己的迷你服务器。服务器可以使用maya命令端口,或使用内置wsgiref
模块的wsgi server。 Here是一个使用在独立内部运行的wsgiref通过http远程控制maya的示例。
答案 3 :(得分:0)
我们一直在处理同样的问题。我们使用Celery作为任务管理器,并在Celery任务中使用这样的代码在工作机器上进行播放。这是在Windows上完成的并使用Python。
import os
import subprocess
import tempfile
import textwrap
MAYA_EXE = r"C:\Program Files\Autodesk\Maya2016\bin\maya.exe"
def function_name():
# the python code you want to execute in Maya
pycmd = textwrap.dedent('''
import pymel.core as pm
# Your code here to load your scene and playblast
# new scene to remove quicktimeShim which sometimes fails to quit
# with Maya and prevents the subprocess from exiting
pm.newFile(force=True)
# wait a second to make sure quicktimeShim is gone
time.sleep(1)
pm.evalDeferred("pm.mel.quit('-f')")
''')
# write the code into a temporary file
tempscript = tempfile.NamedTemporaryFile(delete=False, dir=temp_dir)
tempscript.write(pycmd)
tempscript.close()
# build a subprocess command
melcmd = 'python "execfile(\'%s\')";' % tempscript.name.replace('\\', '/')
cmd = [MAYA_EXE, '-command', melcmd]
# launch the subprocess
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.wait()
# when the process is done, remove the temporary script
try:
os.remove(tempscript.name)
except WindowsError:
pass