Argparse For Handling Command Line Arguments In Blender Python
What are Command Line Arguments?
Command line arguments are values passed to a program when it is invoked from the command line interface (CLI). They allow users to customize and parameterize the behavior of a program. In Python and Blender, the sys.argv list contains the command line arguments passed to a script.
For example, when invoking a Blender Python script called “render.py” the user could pass arguments like:
blender --background --python render.py --scene myscene --frames 1-250
Here ‘–scene’, ‘–frames’ are command line arguments that tell the render.py script which scene to render and the frame range. The argparse module makes it easy to parse such arguments in a Python script.
Argparse Module for Parsing Arguments
Argparse is the recommended command line parsing module in Python’s standard library. It allows creating user-friendly command line interfaces easily by defining arguments and automatically generating help/usage instructions.
Creating a Parser
The first step is to create an ArgumentParser object which will hold the definitions of arguments:
import argparse parser = argparse.ArgumentParser(description="My utility")
Adding Arguments
Various types of arguments can be added to the parser object. Some common ones are:
parser.add_argument("-s", "--scenes", nargs="+", help="Scene names") parser.add_argument("-o", "--output", required=True, help="Output path") parser.add_argument("--render", action="store_true", help="Render scenes")
These arguments can then be accessed later after parsing.
Parsing Arguments
Once arguments are defined, the parser is ready to accept command line arguments. These can be parsed from sys.argv:
args = parser.parse_args()
This populated the args object with attributes for the defined arguments, which can now be accessed.
Accessing Arguments in Blender Python
Getting Argument Values
The parsed args object simply contains attributes for all arguments defined. For example with above parser:
scenes = args.scenes output = args.output render = args.render
Blender Python Contexts
Blender exposes Python in various contexts like operators, panels etc. Argparse can be used in all of them but care must be taken to parse arguments at the right time:
- Scripts invoked on command line: Parse arguments at start
- Operators: Parse arguments in execute() method
- Panels: Parse argments in draw() method
Argument Types
Argparse supports various kinds of argument types:
Positional Arguments
Required scalar arguments without any flags:
parser.add_argument("scene", help="Scene name")
Optional Arguments
Optional scalar arguments with flags:
parser.add_argument("-o", "--output", required=False, help="Output path")
Flag Arguments
Boolean flags that enable/disable features:
parser.add_argument("--render", action="store_true", help="Render scene")
Choice Arguments
Constrain argument to certain choices:
parser.add_argument("-t", "--type", choices=["static", "animated"], help="Scene type")
Help Messages and Usage
Automatically Generated Help
Argparse automatically generates help messages and usage instructions:
parser.print_help()
It uses the descriptions and help texts provided while adding arguments.
Custom Messages
Custom usage instructions and error handling can also be provided:
parser.usage = "my_utility <arguments>" parser.error = lambda msg: print("Error: ", msg)
Example Scripts
Simple Example
Here is simple Blender script to process scenes using argparse:
import argparse import sys import blender parser = argparse.ArgumentParser() parser.add_argument("-s", "--scenes", nargs="+", help="Scene names to render") parser.add_argument("-f", "--format", choices=["PNG", "JPEG"], help="Output format") args = parser.parse_args() for scene_name in args.scenes: bpy.data.scenes[scene_name].render.filepath = f"{scene_name}.{args.format.lower()}" blender.render_scene(bpy.data.scenes[scene_name])
Integrating in Production Add-ons
For production plugins and add-ons, argparse can provide uniform CLI handling both for end-users invoking scripts as well as developer convenience features.
Common Use Cases
Some common use cases well suited for command line arguments:
Procedural Generation
Parametrizing scene generation via scripts, e.g:
python generate.py --objects 100 --size Large
Automating Tasks
Scripting workflows by allowing task parameters via CLI instead of GUI.
Building Interfaces
Expose parameters via CLI for rapid iterative script development.
Best Practices
Allow Both GUI and CLI
Design UI features to optionally work with command line arguments for maximum flexibility.
Careful Argument Naming
Use explicit argument names that map clearly to their purpose.
Complete Documentation
Document all arguments exposed by a script in accompanying documentation.
Limitations to Keep in Mind
Some limitations of argparse and CLI arguments:
Security Considerations
Features that directly execute system commands can expose vulnerabilities.
Platform Dependence
Argument handling behavior on Windows CMD vs Linux shells may differ.
Conclusion
The argparse module enables easily building rich command line interfaces for both Blender specific scripts as well as production plugins. With its support for argument types and automatic help generation, it greatly simplifies argument handling.
Used properly, command line arguments complement guis by exposing automation capability and rapid iteration during development. They bring the flexibility that makes Blender such a versatile platform for different users with diverse workflows.