在一个系统中运行的Python脚本将在另一个系统中执行结果
我正在尝试编写一个python脚本,当它执行时,将在另一台计算机上打开一个Maya文件,并在那里创建它的playblast。这可能吗?另外,我想补充一点,我使用的系统都是Windows。谢谢为了在远程计算机上执行某些操作,您必须在那里运行某种服务 如果它是linux机器,您只需通过ssh连接并运行命令即可。在python中,您可以使用以下方法完成此操作: 否则,您可以使用python服务,但必须事先运行它。 您可以使用前面提到的芹菜,或者更简单地使用: 只需在目标机器上运行在一个系统中运行的Python脚本将在另一个系统中执行结果,python,maya,Python,Maya,我正在尝试编写一个python脚本,当它执行时,将在另一台计算机上打开一个Maya文件,并在那里创建它的playblast。这可能吗?另外,我想补充一点,我使用的系统都是Windows。谢谢为了在远程计算机上执行某些操作,您必须在那里运行某种服务 如果它是linux机器,您只需通过ssh连接并运行命令即可。在python中,您可以使用以下方法完成此操作: 否则,您可以使用python服务,但必须事先运行它。 您可以使用前面提到的芹菜,或者更简单地使用: 只需在目标机器上运行rpyc_classi
rpyc_classic.py
脚本,然后就可以在其上运行python:
conn = rpyc.classic.connect("my_remote_server")
conn.modules.os.system('echo foo')
或者,您可以创建自定义RPyC服务(请参阅文档)
最后一个选项是使用HTTP服务器,就像前面建议的那样。如果您不想开始安装所有内容,这可能是最简单的。您可以使用python中的一个简单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')
是的,这是可能的,我总是在几台电脑上这样做。首先,您需要访问计算机。这已经得到了回答。然后从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可以节省几秒钟)廉价rpc的最后一个选项是从Maya python(“mayapy”,通常安装在Maya二进制文件旁边)运行Maya.standalone。standalone将在常规python脚本中运行,因此它可以使用KimiNewts answer中的任何远程过程技巧
您还可以使用基本python创建自己的迷你服务器。服务器可以使用maya命令端口,也可以使用内置的
wsgiref
模块。是一个使用在单机版中运行的wsgiref通过http远程控制maya的示例。我们在工作中一直在处理相同的问题。我们使用芹菜作为任务管理器,芹菜任务中有这样的代码,用于在工作机器上播放爆破。这是在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
我要尝试的第一件事是使用Python内置的HTTP服务器在另一台计算机上创建一个类似服务的应用程序。然后,“local”脚本将通过IP:port创建一个以服务为目标的请求,该服务将执行它应该执行的操作。这是一台windows机器吗?因为你得到了很多关于linux的答案。非常感谢。我会试着看看我得到了什么。我下载了rpyc并在网站包中提取了它,但它不起作用。当我运行“import rpyc”时,它仍然会给出“No module named rpyc”的错误。这没什么大不了的,但他确实要求使用Python:)如何在Windows平台的Python脚本中调用Maya?感谢您使用系统调用将其命名为linux?问题是,虽然maya有一个python可调用版本,但它没有启动GUI,所以它不能playblast@ShannonHochkins当然,但playblast仅存在于mayas gui中,虽然它有python解释器,但您仍然需要单独启动maya,因此,除非您希望maya永久运行,否则在mel或python中播放预览的更改很小。我是唯一一个处理游戏爆破的人。你仍然可以从python调用它。如果不是为了playblast没有问题,所有不需要gui层的东西都是另一回事。你没有mayapy的gui线程,所以你不能playblast。gui与脚本层是分离的,没有任何东西表明您不能在gui中运行服务器。毕竟,多年前我用玛雅为网页提供服务,只有梅尔。受虐狂:)忘了他是在玩游戏,我总是使用便宜的渲染,而不是在我自己的机器上
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