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

时间:2014-09-07 10:39:45

标签: python maya

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

4 个答案:

答案 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 serverHere是一个使用在独立内部运行的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