используйте внешний скрипт Python, чтобы открыть Maya и запустить другой скрипт внутри Maya

Можно ли вызвать сценарий из командной строки в Windows (или bash в Linux), чтобы открыть Maya, а затем запустить собственный сценарий (возможно, меняющийся при каждом запуске) внутри Maya? Я ищу что-то более элегантное, чем изменение файла userSetup и запуск Maya.

Цель здесь состоит в том, чтобы иметь возможность открыть файл .mb, запустить сценарий для размещения сцены внутри, настроить общий набор источников света, а затем отобразить сцену в определенном месте и для определенного типа файла. Я хочу иметь возможность настроить это как запланированную задачу, чтобы проверить наличие любых новых файлов сцены в каталоге, а затем открыть Maya и пойти.

Спасибо за помощь!


person TheBeardedBerry    schedule 12.12.2014    source источник
comment
Вы хотите, чтобы Maya работала в пакетном режиме, а не в режиме графического интерфейса? Я бы сделал это для этой цели.   -  person kartikg3    schedule 12.12.2014


Ответы (2)


Для чего-то подобного вы можете использовать автономный Maya вместо полноценного режима пользовательского интерфейса. Это быстрее. Он идеально подходит для пакетных запланированных заданий, подобных этим. Автономная версия Maya — это просто Maya, работающая без графического интерфейса. После того как вы инициализировали Maya в автономном режиме, вы можете импортировать и вызывать любые сценарии, которые хотите, как часть исходного вызывающего сценария. Для начала вот пример: (Не стесняйтесь использовать его в качестве справки/изменить его в соответствии с вашими потребностями)

В вашем скрипте вы сначала инициализируете Maya в автономном режиме.

import maya.standalone
maya.standalone.initialize("Python")

import maya.cmds as cmds
cmds.loadPlugin("Mayatomr") # Load all plugins you might need

Это заставит Майю работать. Теперь мы открываем и/или импортируем все необходимые файлы (например, источники света, модели и т. д.)

# 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 для его рендеринга.

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() Подпроцесс и всплывающее окно

ПЛЮС, из-за удивительности Python вы можете использовать такие модули, как sched (docs), чтобы планировать запуск этого метода в вашем коде Python.

Надеюсь, это было полезно. Получайте удовольствие от этого. Ваше здоровье.

person kartikg3    schedule 12.12.2014

Многое зависит от того, что вам нужно сделать.

Если вы хотите запустить скрипт, который имеет доступ к функциям Maya, вы можете запустить автономный экземпляр Maya, как в ответе Картика. Двоичный файл mayapy, установленный в той же папке, что и ваш Maya, является интерпретатором Maya python, вы можете запустить его напрямую так же, как запускаете python.exe Mayapy имеет те же командные флаги, что и обычный интерпретатор Python.

Внутри сеанса Mayapy, как только вы вызовете standalone.initialize(), у вас будет работающий сеанс Maya - за некоторыми исключениями, это как если бы вы работали внутри вкладки скрипта в обычном сеансе Maya.

Чтобы заставить Maya запускать определенный скрипт при запуске, вы можете вызвать флаг -c точно так же, как в python. Например, вы можете запустить Maya и распечатать содержимое пустой сцены, как это (примечание: я предполагаю, что mayapy.exe находится на вашем пути. Вы также можете просто перейти в каталог Maya bin).

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()\""

который снова запускает автономный режим для вас, но сохраняет сеанс вместо запуска команды и выхода.

Чтобы запустить файл сценария, просто передайте файл в качестве аргумента. В этом случае вы захотите сделать, как предлагает Картик, и включить standalone.initalize() в сценарий. Затем вызовите его с помощью

mayapy path/to/script.py

Чтобы подавить userSetup, вы можете создать переменную environmnet с именем MAYA_SKIP_USERSETUP_PY и установить для нее ненулевое значение, которое загрузит Maya без запуска usersetup. Вы также можете изменить переменные среды или переменные пути перед запуском Mayap; например, я могу запустить mayapys из двух разных сред с этими двумя псевдонимами bash (в Windows вы должны использовать SET вместо EXPORT для изменения env vars):

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()\""

Это сообщение в блоге содержит модуль Python для запуска Mayapy. экземпляры с различными средами по мере необходимости.

Если вы хотите взаимодействовать с работающим Maya из другой среды — скажем, если вы пытаетесь дистанционно управлять им с портативного устройства или программы C — вы можете использовать Maya commandPort для обработки простых запросов через TCP. Для более сложных ситуаций вы можете настроить базовую службу удаленного взаимодействия, подобную этой самостоятельно или используйте предварительный RPC-модуль Python, например RPyC или ZeroMQ

person theodox    schedule 12.12.2014
comment
Некоторые очень сладкие драгоценные камни здесь! Спасибо @Theodox. особ. нравятся предложения о ZeroMQ и ваш пост в блоге о множественной мании Mayapy. - person kartikg3; 12.12.2014