Maybe this could help you. This is still not finished but should give you an idea how to solve it.
"""Context. Generally submitting render with maya does not require pre and post process.
If you however require to do pre or post scripts your are going to use mel. This python module is trying
to solve this problem.
"""
import abc
from pymel import core as pm
class AbstractRender(object):
"""Base class for render process.
Attributes:
__metaclass__ (<abc.ABCMeta>): Meta class.
"""
__metaclass__ = abc.ABCMeta
def __init__(
self,
file_path,
start_frame,
end_frame,
camera,
pre_function=None,
post_function=None,
offset=0,
):
"""Initialize class and do nothing.
Args:
file_path (str): Path to file name.
start_frame (int): First frame of file path.
end_frame (int): Last frame of file path.
camera (str): Camera name to use.
offset (int): Frame offset to use default to 0.
"""
super(AbstractRender, self).__init__()
self.file_path = file_path
self.start_frame = start_frame
self.end_frame = end_frame
self.camera = camera
self.pre_function = pre_function
self.post_function = post_function
self.offset = offset
@abc.abstractmethod
def _render(self, frame):
"""Implement me in super class."""
pass
def _pre_render(self):
"""Execute pre render command."""
if self.pre_function:
self.pre_function()
def _post_render(self):
"""Execute post render command."""
if self.post_function:
self.post_function()
def __call__(self):
"""Execute render."""
if self._pre_render:
self._pre_render()
pm.setAttr("defaultRenderGlobals.animation", False)
pm.setAttr("defaultRenderGlobals.outFormatControl", False)
for frame in range(self.start_frame, self.end_frame + 1):
pm.SCENE.defaultRenderGlobals.imageFilePrefix.set(
"{path}.{padding}".format(
path=self.file_path, padding=frame + self.offset
)
)
self._render(frame)
if self._post_render:
self._post_render()
class OsgRender(AbstractRender):
"""A class for executing hardware render 2.0 renders."""
def _render(self, frame):
"""Render current frame with hardware render 2.0.
Args:
frame (int): Frame to render.
"""
pm.ogsRender(camera=self.camera, frame=frame)
class HwRender(AbstractRender):
"""A class for executing hardware render renders."""
def _render(self, frame):
"""Render current frame with hardware render.
Args:
frame (int): Frame to render.
"""
pm.hwRender(frame=frame, camera=self.camera)
class ArnoldPythonRender(AbstractRender):
"""A class for executing arnold renders."""
def __call__(self):
"""Set arnold driver settings to png."""
driver = pm.PyNode("defaultArnoldDriver")
driver.ai_translator.set("png")
super(ArnoldPythonRender, self).__call__()
def _render(self, frame):
"""Render current frame with arnold.
Args:
frame (int): Frame to render.
"""
pm.currentTime(frame)
pm.arnoldRender(camera=self.camera, batch=True)