是否可以从Windows中的命令提示符(或linux中的bash)调用脚本来打开Maya,然后在Maya中运行自定义脚本(可能每次运行时更改)?我正在寻找比更改userSetup文件然后运行Maya更优雅的东西。
这里的目标是能够打开.mb文件,运行脚本将场景定位在里面,设置一组通用灯光,然后将场景渲染到特定的位置和文件类型。我希望能够将其设置为计划任务,以检查目录中的任何新场景文件,然后打开maya并继续。
感谢您的帮助!
答案 0 :(得分:9)
对于这样的东西,你可以使用Maya独立而不是完整的UI模式。它更快。它非常适合像这样的批量预定作业。 Maya standalone只是在没有GUI的情况下运行的Maya。初始化Maya独立版后,您可以导入并调用所需的任何脚本,作为原始调用脚本的一部分。在这里开始是一个例子:(随意使用它作为参考/修改它以满足您的需求)
在您的脚本中,首先初始化Maya独立版。
import maya.standalone
maya.standalone.initialize("Python")
import maya.cmds as cmds
cmds.loadPlugin("Mayatomr") # Load all plugins you might need
这将使Maya运行。现在我们打开和/或导入所有必要的文件(例如灯光,模型等)
# full path to your Maya file to OPEN
maya_file_to_open = r"C:/Where/Ever/Your/Maya_Scene_Files/Are/your_main_maya_file.mb"
# Open your file
opened_file = cmds.file(maya_file_to_open, o=True)
# full path to your Maya file to IMPORT
maya_file_to_import = r"C:/Where/Ever/Your/Maya_Scene_Files/Are/your_maya_file.mb"
# Have a namespace if you want (recommended)
namespace = "SomeNamespaceThatIsNotAnnoying"
# Import the file. the variable "nodes" will hold the names of all nodes imported, just in case.
nodes = cmds.file(maya_file_to_import, i=True,
renameAll=True,
mergeNamespacesOnClash=False,
namespace=namespace,
returnNewNodes=True,
options="v=0;",
type="mayaBinary" # any file type you want. this is just an example.
)
#TODO: Do all your scene setup/ positioning etc. if needed here...
#Tip: you can use cmds.viewFit(cam_name, fitFactor=1) to fit your camera on to selected objects
现在我们保存此文件并调用Maya Batch渲染器将其渲染出来
render_file = "C:/Where/Ever/Your/Maya_Scene_Files/Are/your_RENDER_file.mb"
cmds.file(rename=render_file)
cmds.file(force=True, save=True, options='v=1;p=17', type='mayaBinary')
import sys
from os import path
from subprocess import Popen
render_project = r"C:/Where/Ever/YourRenderProjectFolder"
renderer_folder = path.split(sys.executable)[0]
renderer_exec_name = "Render"
params = [renderer_exec_name]
params += ['-percentRes', '75']
params += ['-alpha', '0']
params += ['-proj', render_project]
params += ['-r', 'mr']
params += [render_file]
p = Popen(params, cwd=renderer_folder)
stdout, stderr = p.communicate()
就是这样!当然,您的脚本必须使用Maya的Python解释器(Mayapy)运行。
请查看用于更多选项的所有命令的文档,特别是: cmds.file() cmds.viewFit() cmds.loadPlugin() Subprocess and Popen
PLUS,由于Python非常棒,您可以使用sched
(docs)之类的模块来安排在Python代码中运行此方法。
希望这很有用。玩得开心。欢呼声。
答案 1 :(得分:3)
很大程度上取决于你需要做什么。
如果要运行可以访问Maya功能的脚本,可以像在Kartik的答案中一样运行Maya独立实例。与maya安装在同一文件夹中的mayapy
二进制文件是Maya python解释器,您可以像运行python.exe
一样直接运行它.Mayapy具有与常规python解释器相同的命令标志。
在mayapy会话中,一旦您调用standalone.initialize()
,您将有一个正在运行的Maya会话 - 除了少数例外情况,就好像您在常规maya会话中的脚本选项卡中运行一样。
要强制Maya在启动时运行特定脚本,您可以调用-c
标志,就像在python中一样。例如,你可以启动一个maya并打印出这样一个空场景的内容(注意:我假设mayapy.exe
在你的路径上。你也可以CD到maya bin目录。)< / p>
mayapy -c 'import maya.standalone; maya.standalone.initialize(); import maya.cmds as cmds; print cmds.ls()'
>>> [u'time1', u'sequenceManager1', u'renderPartition', u'renderGlobalsList1', u'defaultLightList1', u'defaultShaderList1', u'postProcessList1', u'defaultRenderUtilityList1', u'defaultRenderingList1', u'lightList1', u'defaultTextureList1', u'lambert1', u'particleCloud1', u'initialShadingGroup', u'initialParticleSE', u'initialMaterialInfo', u'shaderGlow1', u'dof1', u'defaultRenderGlobals', u'defaultRenderQuality', u'defaultResolution', u'defaultLightSet', u'defaultObjectSet', u'defaultViewColorManager', u'hardwareRenderGlobals', u'hardwareRenderingGlobals', u'characterPartition', u'defaultHardwareRenderGlobals', u'lightLinker1', u'persp', u'perspShape', u'top', u'topShape', u'front', u'frontShape', u'side', u'sideShape', u'hyperGraphInfo', u'hyperGraphLayout', u'globalCacheControl', u'brush1', u'strokeGlobals', u'ikSystem', u'layerManager', u'defaultLayer', u'renderLayerManager', u'defaultRenderLayer']
你可以交互式地运行mayapy - 有效地命令行版本的maya - 使用-i标志:这将启动mayapy并给你一个命令提示符:
mayapy -i -c \"import maya.standalone; maya.standalone.initialize()\""
它再次启动独立,但保持会话继续而不是运行命令并退出。
要运行脚本文件,只需将文件作为参数传入。在这种情况下,你想要像Kartik建议的那样做,并在脚本中包含standalone.initalize()
。然后用
mayapy path/to/script.py
要禁止userSetup,您可以创建一个名为MAYA_SKIP_USERSETUP_PY
的environmnet变量并将其设置为非零值,这将加载maya而不运行usersetup。您还可以在运行mayap之前更改环境变量或路径变量;例如,我可以使用这两个bash别名从两个不同的环境中运行mayapys(在windows中你使用SET而不是EXPORT来更改env变量):
alias mp_zip="export MAYA_DEV=;mayapy -i -c \"import maya.standalone; maya.standalone.initialize()\""
alias mp_std="export MAYA_DEV=C:/UL/tools/python/ulmaya;export ZOMBUILD='C:/ul/tools/python/dist/ulmaya.zip';mayapy -i -c \"import maya.standalone; maya.standalone.initialize()\""
This blog post包含一个python模块,用于根据需要在不同的环境中启动Mayapy实例。
如果您想与来自其他环境的正在运行的maya进行交互 - 例如,如果您尝试从手持设备或C程序远程控制它 - 您可以使用Maya commandPort来处理简单请求通过TCP。对于更复杂的情况,您可以设置自己的基本远程服务like this,或使用预先放映的python RPC模块,如RPyC或ZeroMQ