# This script is an example of how you can run blender from the command line # (in background mode with no interface) to automate tasks, in this example it # creates a text object, camera and light, then renders and/or saves it. # This example also shows how you can parse command line options to scripts. # # Example usage for this test. # blender --background --factory-startup --python $HOME/background_job.py -- \ # --text="Hello World" \ # --render="/tmp/hello" \ # --save="/tmp/hello.blend" # # Notice: # '--factory-startup' is used to avoid the user default settings from # interfering with automated scene generation. # # '--' causes blender to ignore all following arguments so python can use them. # # See blender --help for details. import bpy def example_function(text, save_path, render_path): # Clear existing objects. bpy.ops.wm.read_factory_settings(use_empty=True) scene = bpy.context.scene txt_data = bpy.data.curves.new(name="MyText", type='FONT') # Text Object txt_ob = bpy.data.objects.new(name="MyText", object_data=txt_data) scene.collection.objects.link(txt_ob) # add the data to the scene as an object txt_data.body = text # the body text to the command line arg given txt_data.align_x = 'CENTER' # center text # Camera cam_data = bpy.data.cameras.new("MyCam") cam_ob = bpy.data.objects.new(name="MyCam", object_data=cam_data) scene.collection.objects.link(cam_ob) # instance the camera object in the scene scene.camera = cam_ob # set the active camera cam_ob.location = 0.0, 0.0, 10.0 # Light light_data = bpy.data.lights.new("MyLight", 'POINT') light_ob = bpy.data.objects.new(name="MyLight", object_data=light_data) scene.collection.objects.link(light_ob) light_ob.location = 2.0, 2.0, 5.0 bpy.context.view_layer.update() if save_path: bpy.ops.wm.save_as_mainfile(filepath=save_path) if render_path: render = scene.render render.use_file_extension = True render.filepath = render_path bpy.ops.render.render(write_still=True) def main(): import sys # to get command line args import argparse # to parse options for us and print a nice help message # get the args passed to blender after "--", all of which are ignored by # blender so scripts may receive their own arguments argv = sys.argv if "--" not in argv: argv = [] # as if no args are passed else: argv = argv[argv.index("--") + 1:] # get all args after "--" # When --help or no args are given, print this help usage_text = ( "Run blender in background mode with this script:" " blender --background --python " + __file__ + " -- [options]" ) parser = argparse.ArgumentParser(description=usage_text) # Example utility, add some text and renders or saves it (with options) # Possible types are: string, int, long, choice, float and complex. parser.add_argument( "-t", "--text", dest="text", type=str, required=True, help="This text will be used to render an image", ) parser.add_argument( "-s", "--save", dest="save_path", metavar='FILE', help="Save the generated file to the specified path", ) parser.add_argument( "-r", "--render", dest="render_path", metavar='FILE', help="Render an image to the specified path", ) args = parser.parse_args(argv) # In this example we won't use the args if not argv: parser.print_help() return if not args.text: print("Error: --text=\"some string\" argument not given, aborting.") parser.print_help() return # Run the example function example_function(args.text, args.save_path, args.render_path) print("batch job finished, exiting") if __name__ == "__main__": main()