在一个系统中运行的Python脚本将在另一个系统中执行结果

在一个系统中运行的Python脚本将在另一个系统中执行结果,python,maya,Python,Maya,我正在尝试编写一个python脚本,当它执行时,将在另一台计算机上打开一个Maya文件,并在那里创建它的playblast。这可能吗?另外,我想补充一点,我使用的系统都是Windows。谢谢为了在远程计算机上执行某些操作,您必须在那里运行某种服务 如果它是linux机器,您只需通过ssh连接并运行命令即可。在python中,您可以使用以下方法完成此操作: 否则,您可以使用python服务,但必须事先运行它。 您可以使用前面提到的芹菜,或者更简单地使用: 只需在目标机器上运行rpyc_classi

我正在尝试编写一个python脚本,当它执行时,将在另一台计算机上打开一个Maya文件,并在那里创建它的playblast。这可能吗?另外,我想补充一点,我使用的系统都是Windows。谢谢

为了在远程计算机上执行某些操作,您必须在那里运行某种服务

如果它是linux机器,您只需通过ssh连接并运行命令即可。在python中,您可以使用以下方法完成此操作:

否则,您可以使用python服务,但必须事先运行它。 您可以使用前面提到的芹菜,或者更简单地使用:

只需在目标机器上运行
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