Blender to Backburner (free autodesk network renderer)

A script to send your render as a render job to Autodesk Backburner on windows.
I’ve had some problems with the blender netrender, and flamenco is near impossible to install on windows, so i found an old script by Matt Ebb and made it work with blender 2.76.

I havent had time to test it very much, but in all cases i’ve tried it works great.

Credit goes to Matt Ebb who did most of the work in his old Blender 2.5 script :slight_smile:

It should work fine with the free Autodesk backburner:
https://knowledge.autodesk.com/support/3ds-max/downloads/caas/downloads/content/backburner-2015-windows-version-for-3ds-max3ds-max-design-2015.html

Please let me know your results, and if you have any thoughts on improving it ( although i suck and scripting :stuck_out_tongue: )



bl_info = {
    "name": "Backburner",
    "author": "Matt Ebb + Blaize",
    "version": (1, 0),
    "blender": (2, 72, 1),
    "location": "Properties > Render",
    "description": "Network and Queue with Autodesk Backburner",
    "warning": "",
    "wiki_url": "",
    "category": "Render"}

import bpy, os, subprocess
from subprocess import Popen, PIPE
from bpy.props import PointerProperty, StringProperty, BoolProperty, EnumProperty, IntProperty, CollectionProperty

default_backburner_path = 'C:\\Program Files (x86)\\Autodesk\\Backburner\\cmdjob.exe'
default_blender_path = 'C:\\Program Files\\Blender Foundation\\Blender\\blender.exe'

#def rnaType(rna_type):
#    if bpy: bpy.types.register(rna_type)
#    return rna_type

#@rnaType

class BackburnerSettings(bpy.types.PropertyGroup):
    pass

bpy.utils.register_class(BackburnerSettings)

# entry point for settings collection
bpy.types.Scene.backburner = PointerProperty(
    type=BackburnerSettings, name='Backburner Submission', description='Backburner Submission Settings')

# fill the new struct
BackburnerSettings.job_name = StringProperty(
    name='Job Name', description='Name of the job to be shown in Backburner', maxlen=256, default='')

BackburnerSettings.frames_per_task = IntProperty(
    name='Frames per Task', description='Number of frames to give each render node', min=1, max=1000, soft_min=1, soft_max=64, default=1)
BackburnerSettings.timeout = IntProperty(
    name='Timeout', description='Timeout per task', min=1, max=1000, soft_min=1, soft_max=64, default=120)
BackburnerSettings.priority = IntProperty(name='Priority', description='Priority of this job', min=1, max=1000, soft_min=1, soft_max=64, default=50)

BackburnerSettings.override_frame_range = BoolProperty(
    name='Override Frame Range', description='Override scene start and end frames', default=False)
BackburnerSettings.frame_start = IntProperty(
    name='Start Frame', description='Start frame of animation sequence to render', min=1, max=1000, soft_min=1, soft_max=64, default=1)
BackburnerSettings.frame_end = IntProperty(
    name='End Frame', description='End frame of animation sequence to render', min=1, max=1000, soft_min=1, soft_max=64, default=250)

#BackburnerSettings.group = StringProperty(
    #name='Group', description='Render this job only with the servers in this group', maxlen=400, default='Localhost')
BackburnerSettings.servers = StringProperty(
    name='Servers', description='Render this job only with the servers specified (semi-colon separated list - ignored if group is used)', maxlen=400, default='')

BackburnerSettings.path_backburner = StringProperty(
    name='Backburner Path', description='Path to Backburner cmdjob.exe', maxlen=400, default=default_backburner_path, subtype='FILE_PATH')
BackburnerSettings.path_blender = StringProperty(
    name='Blender Path', description='Path to blender.exe', maxlen=400, default=default_blender_path, subtype='FILE_PATH')

    
class RENDER_PT_Backburner(bpy.types.Panel):
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "render"
    bl_label = 'Backburner'
    bl_default_closed = True

    def draw(self, context):
        layout = self.layout      

        scene = context.scene
        bb = scene.backburner

        layout.operator('render.submit_to_backburner', icon='RENDER_ANIMATION')

        layout.separator()

        layout.prop(bb, 'job_name')
        layout.prop(bb, 'frames_per_task')
        row = layout.row()
        row.prop(bb, 'timeout')
        row.prop(bb, 'priority')

        layout.separator()
        
        #layout.prop(bb, 'override_frame_range')

        row = layout.row()
        row.enabled = bb.override_frame_range
        #row.prop(bb, 'frame_start')
        #row.prop(bb, 'frame_end')

        layout.prop(bb, 'group')
        layout.prop(bb, 'servers')

        layout.prop(bb, 'path_backburner')
        layout.prop(bb, 'path_blender')

        
def write_tasklist(step, sframe, eframe, filename):
    dir = os.path.dirname(filename)

    # if we need a unique ID?
    # id = str(time.time())[:-3]
    # tasklist_path = dir + '\\submit_temp_' + id + '.txt'

    tasklist_path = dir + '\\submit_temp.txt'
    try:
        file = open(tasklist_path, 'w')
    except:
        print("couldn't open " + tasklist_path + " for writing")

    curframe = sframe
    while(curframe <= eframe):
        seq_sta = curframe
        seq_end = curframe + (step-1)
        if seq_end > eframe: seq_end = eframe
        curframe = seq_end + 1
        
        task = 'Frame ' + str(seq_sta)
        if seq_sta != seq_end:
            task += ' - ' + str(seq_end)
        task += '    '
        task += str(seq_sta) + '    ' + str(seq_end) + '
'
        file.write(task)
    
    file.close()
    return tasklist_path

def submit(scene):

    bb = scene.backburner

    filename = bpy.data.filepath
    blenderdir = os.path.dirname(bb.path_blender)

    print('--- Submitting: ')
    manager = 'localhost'
    description = 'Rendering_to_' + scene.render.filepath

    tasklist_path = write_tasklist(bb.frames_per_task, bb.frame_start, bb.frame_end, filename)

    cmd = '"' + bb.path_backburner + '"'
    cmd += ' -jobName:' + bb.job_name
    cmd += ' -description:' + description
    cmd += ' -manager:' + manager
    cmd += ' -priority:' + str(bb.priority)
    cmd += ' -timeout:' + str(bb.timeout)
    #cmd += ' -manager:' + bb.group
    if bb.servers != '':
        cmd += ' -servers:' + bb.servers
    cmd += ' -workPath:' + blenderdir
    cmd += ' -taskList:' + tasklist_path
    cmd += ' -taskName: 1'
    cmd += ' "' + bb.path_blender + '" --background '
    cmd += filename
    cmd += ' --frame-start %tp2 --frame-end %tp3 --render-anim'

    print(cmd)

    result = subprocess.call(cmd)
    if result != 0:
        print('Submit Failed for: ' + filename)
        submit_status = "FAILED"
    else:
        print('Submit Suceeded for: ' + filename)
        submit_status = "OK"

    os.remove(tasklist_path)
    return {'FINISHED'}
    

class SubmitToBackburner(bpy.types.Operator):
    ''''''
    bl_idname = "render.submit_to_backburner"
    bl_label = "Submit to Backburner"

    @classmethod
    def poll(cls, context):
        return context.scene != None

    def invoke(self, context, event):
        bb = context.scene.backburner
        if bb.path_blender == '':
            self.report({'ERROR'}, "Network path to Blender hasn't been set")
            return {'CANCELLED'}
        if bb.path_backburner == '':
            self.report({'ERROR'}, "Path to Backburner cmdjob.exe hasn't been set")
            return {'CANCELLED'}
        submit(context.scene)
        return {'FINISHED'}

    def execute(self, context):
        submit(context.scene)

def register():
    bpy.utils.register_module(__name__)

def unregister():
    bpy.utils.unregister_module(__name__)

if __name__ == "__main__":
    register()
1 Like

Thanks you @Joel_nl for sharing this useful script!
have a nice week-end!
Congratulations to Matt Ebb.

We use this script as our render queue manager at work fulltime now.
To make this work with our old (3dsmax) setup i had to make some changes to allow Blender to connect to the Backburner manager that runs on a different system. ofcourse this still works with any other setup afaik.

Just fill in the name of the Render manager (default: Localhost) and send it to backburner.
One small error is that as soon as you enable the frame override option it uses whatever frame range you’ve selected. even when disabling the override frames option.

Still looking into that, but at the moment it works fine. just keep this ‘feature’ in mind :wink:

I personally really like this render farm option compared to others. Backburner is free to use and extremely easy to setup.
For us it’s the perfect renderfarm option on windows systems. (cant wait for Flamenco on windows though)

Happy Rendering!


bl_info = {
    "name": "Backburner",
    "author": "Blaize - original script by Matt Ebb",
    "version": (1, 1),
    "blender": (2, 72, 1),
    "location": "Properties > Render",
    "description": "Network and Queue with Autodesk Backburner",
    "warning": "",
    "wiki_url": "",
    "category": "Render"}


import bpy, os, subprocess
from subprocess import Popen, PIPE
from bpy.props import PointerProperty, StringProperty, BoolProperty, EnumProperty, IntProperty, CollectionProperty


default_backburner_path = 'C:\\Program Files (x86)\\Autodesk\\Backburner\\cmdjob.exe'
default_blender_path = 'C:\\Program Files\\Blender Foundation\\Blender\\blender.exe'


class BackburnerSettings(bpy.types.PropertyGroup):
    pass


bpy.utils.register_class(BackburnerSettings)


# entry point for settings collection
bpy.types.Scene.backburner = PointerProperty(
    type=BackburnerSettings, name='Backburner Submission', description='Backburner Submission Settings')


# fill the new struct
BackburnerSettings.job_name = StringProperty(
    name='Job Name', description='Name of the job to be shown in Backburner', maxlen=256, default='Job_Name')
BackburnerSettings.job_details = StringProperty(
    name='Description', description='Add aditional information to render task', maxlen=400, default='Description')


BackburnerSettings.frames_per_task = IntProperty(
    name='Frames per Task', description='Number of frames to give each render node', min=1, max=1000, soft_min=1, soft_max=64, default=1)
BackburnerSettings.timeout = IntProperty(
    name='Timeout', description='Timeout per task', min=1, max=1000, soft_min=1, soft_max=64, default=120)
BackburnerSettings.priority = IntProperty(name='Priority', description='Priority of this job', min=1, max=1000, soft_min=1, soft_max=64, default=50)


BackburnerSettings.override_frame_range = BoolProperty(
    name='Override Frame Range', description='Override scene start and end frames', default=False)
BackburnerSettings.frame_start = IntProperty(
    name='Start Frame', description='Start frame of animation sequence to render', min=1, max=50000, soft_min=1, soft_max=64, default=1)
BackburnerSettings.frame_end = IntProperty(
    name='End Frame', description='End frame of animation sequence to render', min=1, max=50000, soft_min=1, soft_max=64, default=250)


BackburnerSettings.manager = StringProperty(
    name='Manager', description='Name of render manager', maxlen=400, default='Localhost')
BackburnerSettings.servers = StringProperty(
    name='Servers', description='Render this job only with the servers specified (semi-colon separated list - ignored if group is used)', maxlen=400, default='')


BackburnerSettings.path_backburner = StringProperty(
    name='Backburner Path', description='Path to Backburner cmdjob.exe', maxlen=400, default=default_backburner_path, subtype='FILE_PATH')
BackburnerSettings.path_blender = StringProperty(
    name='Blender Path', description='Path to blender.exe', maxlen=400, default=default_blender_path, subtype='FILE_PATH')


    
class RENDER_PT_Backburner(bpy.types.Panel):
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "render"
    bl_label = 'Backburner'
    bl_default_closed = True


    def draw(self, context):
        layout = self.layout      


        scene = context.scene
        bb = scene.backburner


        layout.operator('render.submit_to_backburner', icon='RENDER_ANIMATION')


        layout.separator()


        layout.prop(bb, 'job_name')
        layout.prop(bb, 'job_details')


        layout.separator()


        layout.prop(bb, 'frames_per_task')
        row = layout.row()
        row.prop(bb, 'timeout')
        row.prop(bb, 'priority')
        layout.prop(bb, 'override_frame_range')


        row = layout.row()
        row.enabled = bb.override_frame_range
        row.prop(bb, 'frame_start')
        row.prop(bb, 'frame_end')


        layout.separator()


        layout.prop(bb, 'manager')
        layout.prop(bb, 'servers')


        layout.prop(bb, 'path_backburner')
        #layout.prop(bb, 'path_blender')


        
def write_tasklist(step, sframe, eframe, filename):
    dir = os.path.dirname(filename)


    tasklist_path = dir + '\\submit_temp.txt'
    try:
        file = open(tasklist_path, 'w')
    except:
        print("couldn't open " + tasklist_path + " for writing")


    curframe = sframe
    while(curframe <= eframe):
        seq_sta = curframe
        seq_end = curframe + (step-1)
        if seq_end > eframe: seq_end = eframe
        curframe = seq_end + 1
        
        task = 'Frame_' + str(seq_sta)
        if seq_sta != seq_end:
            task += ' - ' + str(seq_end)
        task += '	'
        task += str(seq_sta) + '	' + str(seq_end) + '
'
        file.write(task)
    
    file.close()
    return tasklist_path


def submit(scene):


    bb = scene.backburner


    filename = bpy.data.filepath
    blenderdir = default_blender_path


    print('--- Submitting: ')


    tasklist_path = write_tasklist(bb.frames_per_task, bb.frame_start, bb.frame_end, filename)


    cmd = '"' + bb.path_backburner + '"'
    cmd += ' -jobName:"' + bb.job_name + '"'
    cmd += ' -manager ' + bb.manager
    cmd += ' -description:"' + bb.job_details + '"'
    cmd += ' -priority:' + str(bb.priority)
    cmd += ' -timeout:' + str(bb.timeout)
    if bb.servers != '':
        cmd += ' -servers:' + bb.servers
    #cmd += ' -workPath:' + blenderdir
    cmd += ' -taskList:"' + tasklist_path + '"'
    cmd += ' -taskName: 1'
    cmd += ' "' + bb.path_blender + '" --background '
    cmd += '"' + filename + '"'
    cmd += ' --frame-start %tp2 --frame-end %tp3 --render-anim'


    print(cmd)


    result = subprocess.call(cmd)
    if result != 0:
        print('Submit Failed for: ' + filename)
        submit_status = "FAILED"
    else:
        print('Submit Suceeded for: ' + filename)
        submit_status = "OK"


    os.remove(tasklist_path)
    return {'FINISHED'}
    


class SubmitToBackburner(bpy.types.Operator):
    ''''''
    bl_idname = "render.submit_to_backburner"
    bl_label = "Submit to Backburner"


    @classmethod
    def poll(cls, context):
        return context.scene != None


    def invoke(self, context, event):
        bb = context.scene.backburner
        if bb.path_blender == '':
            self.report({'ERROR'}, "Network path to Blender hasn't been set")
            return {'CANCELLED'}
        if bb.path_backburner == '':
            self.report({'ERROR'}, "Path to Backburner cmdjob.exe hasn't been set")
            return {'CANCELLED'}
        submit(context.scene)
        return {'FINISHED'}


    def execute(self, context):
        submit(context.scene)


def register():
    bpy.utils.register_module(__name__)


def unregister():
    bpy.utils.unregister_module(__name__)


if __name__ == "__main__":
    register()

Thank you for this!
I’m not sure how to use this though. Do I paste this to a text file and rename to .py and copy to blender addon folder?
Where will be the button in blender to launch this and send to backburner?
A short video tutorial would be really appreciated.

See the following attachment for the python file :slight_smile:
Extract the zip, Open your use preferences, Add-ons, Install from file, and select the blenderQueue.py

Attachments

blenderQueue.zip (2.23 KB)

Thanks Joel_nl !

I’m getting
Cmdjob adapter: Create Cmdjob Process error: 2
and the render job fails to render and gets suspended in backburner.
I’ve seen this before but never really figured out how to fix it.

Joel_nl,

I’m attempting to use this on a simple test case, but still failing. Here’s what I’ve done:
I’ve installed the script in Blender, as well as backburner on the host computer.
The script is pointed to the backburner executable (cmdjob.exe).
I’ve started the backburner manager and server.
I’ve set output for frames in blender.
I click “Submit to Backburner”, and nothing happens.

What am I forgetting to do?

Thanks!

Make sure backburner manager, server, monitor are seeing each other and connected. If they’re not check firewalls.
Try it locally first before testing out network rendering.

Yes,
They all see each other locally. I’m only testing on one machine at this point.

EDIT: For some reason, going in and AGAIN manually telling the script where to find cmdjob.exe seemed to help. Now I’m stuck at the same place as poly2poly2: “Create Cmdjob Process error: 2”…

OK, figured it out. As far as I can tell, the python script allows you to define the cmdjob.exe path (for backburner), but not the blender.exe path. It is hardcoded. So, at the very least, you need to go into the python script and edit the blender path to match where your copy of blender is. It would be better to update the script so that it allowed input of blender path in the UI. Should be pretty straightforward.

Seems to work for me after that…at least on one machine.

EDIT: OK, I see now that the blender path input was commented out on the python script (near the bottom). So in addition to updating the default location, you can uncomment the line:


#layout.prop(bb, 'path_blender')

Thanks I’ll try to edit the script. I don’t have the same installation for blender I only use the zip file and extract it to the hdd.

Confirmed working! Awesome script.
And now I know what error code 2 means in bb. :smiley:

So it seems the frame range is not being read from the blend file correctly. So you really have to check the override frame range at the bottom. Minor issue.

Hey guys,

Great to hear you’ve got the script working :slight_smile:
Sorry about this issue regarding the blender location, i commented out the blender location because at our office i have blender setup somewhere on the network, and all computers simply link to that location (easy way to make sure everything is up to date)

Regarding the frame range;
If you dont touch the ‘override frame range’ checkbox, the script will simply use the frame range you have defined in the normal render panel, however if you enable the ‘override frame range’ checkbox it will use the value’s you select there.
The problem is that if you disable the ‘override frame range’ checkbox, it will STILL use those value’s

I’ve tried fixing this issue, but havent been able to get it working so far :frowning: (if someone does fix it, please let me know)

Also, Backburner has no controle over CPU or GPU rendering, and i’ve had issue’s in the past with some systems using CPU when my own system uses it’s GPU for rendering.
I’ve got a working version that includes an extra script, forcing the client systems to use GPU rendering :slight_smile:
I’ll clean up the script, and make things a bit more userfriendly so other people can use it also (without having to change the actual python script)

I haven’t seen the issue of it using cpu only.
Maybe it has something to do with the config files of blender?
Where is the config file stored anyway?

Your config file is located in users\Poly2poly2\AppData\Roaming\Blender Foundation\Blender\2.78\config :slight_smile:
But this is a known issue inside blender, and can only be done by forcing the system to use GPU, so i made a very simple script which is run whenever a backburner job is started.

The commandline script includes the blend file, some settings like frame range, the blender executable location, backburner location, and now the script that forces gpu :slight_smile:

In our render nodes theres a local “installation” of blender that is set to gpu rendering in preference. Blender is not on a network path location.
When I see the message in backburner I can see that it reads the config files of blender locally per render.
I think its going to use whatever is the preference settings per render node if it can’t read it it will default to cpu.
So far all our render nodes are using the gpu.
Its great I don’t have to use a different render manager for blender. It can be used with other software :smiley:

I needed to modify this script for a Mac this week. See the working Mac script below. I’ve tested this with Maya 2016/7 and Blender.


bl_info = {
    "name": "Backburner",
    "author": "Blaize - original script by Matt Ebb - Update for Mac OS X by Anthony Hunt",
    "version": (1, 1),
    "blender": (2, 72, 1),
    "location": "Properties > Render",
    "description": "Network and Queue with Autodesk Backburner",
    "warning": "",
    "wiki_url": "",
    "category": "Render"}




import bpy, os, subprocess
from subprocess import Popen, PIPE
from bpy.props import PointerProperty, StringProperty, BoolProperty, EnumProperty, IntProperty, CollectionProperty




default_backburner_path = os.path.join(os.path.sep,'opt','Autodesk','backburner','cmdjob')
default_blender_path = os.path.join(os.path.sep,'Applications','blender.app','Contents','MacOS','blender')




class BackburnerSettings(bpy.types.PropertyGroup):
    pass




bpy.utils.register_class(BackburnerSettings)




# entry point for settings collection
bpy.types.Scene.backburner = PointerProperty(
    type=BackburnerSettings, name='Backburner Submission', description='Backburner Submission Settings')




# fill the new struct
BackburnerSettings.job_name = StringProperty(
    name='Job Name', description='Name of the job to be shown in Backburner', maxlen=256, default='Job_Name')
BackburnerSettings.job_details = StringProperty(
    name='Description', description='Add aditional information to render task', maxlen=400, default='Description')




BackburnerSettings.frames_per_task = IntProperty(
    name='Frames per Task', description='Number of frames to give each render node', min=1, max=1000, soft_min=1, soft_max=64, default=1)
BackburnerSettings.timeout = IntProperty(
    name='Timeout', description='Timeout per task', min=1, max=1000, soft_min=1, soft_max=64, default=120)
BackburnerSettings.priority = IntProperty(name='Priority', description='Priority of this job', min=1, max=1000, soft_min=1, soft_max=64, default=50)




BackburnerSettings.override_frame_range = BoolProperty(
    name='Override Frame Range', description='Override scene start and end frames', default=False)
BackburnerSettings.frame_start = IntProperty(
    name='Start Frame', description='Start frame of animation sequence to render', min=1, max=50000, soft_min=1, soft_max=64, default=1)
BackburnerSettings.frame_end = IntProperty(
    name='End Frame', description='End frame of animation sequence to render', min=1, max=50000, soft_min=1, soft_max=64, default=250)




BackburnerSettings.manager = StringProperty(
    name='Manager', description='Name of render manager', maxlen=400, default='localhost')
BackburnerSettings.servers = StringProperty(
    name='Servers', description='Render this job only with the servers specified (semi-colon separated list - ignored if group is used)', maxlen=400, default='')




BackburnerSettings.path_backburner = StringProperty(
    name='Backburner Path', description='Path to Backburner cmdjob.exe', maxlen=400, default=default_backburner_path, subtype='FILE_PATH')
BackburnerSettings.path_blender = StringProperty(
    name='Blender Path', description='Path to blender.exe', maxlen=400, default=default_blender_path, subtype='FILE_PATH')




    
class RENDER_PT_Backburner(bpy.types.Panel):
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "render"
    bl_label = 'Backburner'
    bl_default_closed = True




    def draw(self, context):
        layout = self.layout      




        scene = context.scene
        bb = scene.backburner




        layout.operator('render.submit_to_backburner', icon='RENDER_ANIMATION')




        layout.separator()




        layout.prop(bb, 'job_name')
        layout.prop(bb, 'job_details')




        layout.separator()




        layout.prop(bb, 'frames_per_task')
        row = layout.row()
        row.prop(bb, 'timeout')
        row.prop(bb, 'priority')
        layout.prop(bb, 'override_frame_range')




        row = layout.row()
        row.enabled = bb.override_frame_range
        row.prop(bb, 'frame_start')
        row.prop(bb, 'frame_end')




        layout.separator()




        layout.prop(bb, 'manager')
        layout.prop(bb, 'servers')




        layout.prop(bb, 'path_backburner')
        layout.prop(bb, 'path_blender')




        
def write_tasklist(step, sframe, eframe, filename):
    dir = os.path.dirname(filename)




    tasklist_path = os.path.join(dir,"submit_temp.txt")
    try:
        file = open(tasklist_path, 'w')
    except:
        print("couldn't open " + tasklist_path + " for writing")




    curframe = sframe
    while(curframe <= eframe):
        seq_sta = curframe
        seq_end = curframe + (step-1)
        if seq_end > eframe: seq_end = eframe
        curframe = seq_end + 1
        
        task = 'Frame_' + str(seq_sta)
        if seq_sta != seq_end:
            task += ' - ' + str(seq_end)
        task += '	'
        task += str(seq_sta) + '	' + str(seq_end) + '
'
        file.write(task)
    
    file.close()
    return tasklist_path




def submit(scene):




    bb = scene.backburner




    filename = bpy.data.filepath
    blenderdir = default_blender_path




    print('--- Submitting: ')




    tasklist_path = write_tasklist(bb.frames_per_task, bb.frame_start, bb.frame_end, filename)




    cmd = '' + bb.path_backburner + ''
    cmd += ' -jobName:"' + bb.job_name + '"'
    cmd += ' -manager ' + bb.manager
    cmd += ' -description:"' + bb.job_details + '"'
    cmd += ' -priority:' + str(bb.priority)
    cmd += ' -timeout:' + str(bb.timeout)
    cmd += ' -suspended'
    #cmd += ' -logPath:' + os.path.join(os.path.dirname(filename),'log')
    if bb.servers != '':
        cmd += ' -servers:' + bb.servers
    #cmd += ' -workPath:' + blenderdir
    cmd += ' -taskList:"' + tasklist_path + '"'
    cmd += ' -taskName: 1'
    cmd += ' "' + bb.path_blender + '" --background '
    cmd += '"' + filename + '"'
    cmd += ' --frame-start %tp2 --frame-end %tp3 --render-anim'




    print(cmd)




    #result = subprocess.call(cmd)
    result = subprocess.check_output(cmd, shell=True)


    if result != 0:
        print('Submit Failed for: ' + filename)
        submit_status = "FAILED"
    else:
        print('Submit Suceeded for: ' + filename)
        submit_status = "OK"




    os.remove(tasklist_path)
    return {'FINISHED'}
    




class SubmitToBackburner(bpy.types.Operator):
    ''''''
    bl_idname = "render.submit_to_backburner"
    bl_label = "Submit to Backburner"




    @classmethod
    def poll(cls, context):
        return context.scene != None




    def invoke(self, context, event):
        bb = context.scene.backburner
        if bb.path_blender == '':
            self.report({'ERROR'}, "Network path to Blender hasn't been set")
            return {'CANCELLED'}
        if bb.path_backburner == '':
            self.report({'ERROR'}, "Path to Backburner cmdjob.exe hasn't been set")
            return {'CANCELLED'}
        submit(context.scene)
        return {'FINISHED'}




    def execute(self, context):
        submit(context.scene)




def register():
    bpy.utils.register_module(__name__)




def unregister():
    bpy.utils.unregister_module(__name__)




if __name__ == "__main__":
    register()

Delete this, please.

1 Like