Overview

Baker lets you easily add a command line interface to your Python functions
using a simple decorator, to create scripts with “sub-commands”, similar to
Django’s manage.py, svn, hg, etc.:

#!python
import baker
# An imaginary script full of useful Python functions
@baker.command
def set(name, value=None, overwrite=False):
"""Sets the value of a key in the database.
If you don't specify a value, the named key is deleted. Overwriting
a value may not be visible to all clients until the next full sync.
"""
db = get_database()
if overwrite or name not in db:
if value is None:
db.delete(name)
print "Deleted %s" % name
else:
db.set(name, value)
print "Set %s to %s" % (name, value)
else:
print "Key exists!"
@baker.command
def get(name):
"Prints the value of a key in the database."
db = get_database()
print db.get(name)
baker.run()

You can then run the script and use your function names and parameters as the
command line interface, using optparse-style options:

$ script.py set alfa bravo
Set alfa to bravo
$ script.py set --overwrite alfa charlie
Set alfa to charlie
$ script.py get alfa
charlie
$ script.py --help
Available commands:
get Prints the value of a key in the database.
set Sets the value of a key in the database
Use "script.py <command> --help" for individual command help.
$ script.py set --help
Usage: script.py set <name> [<value>]
Sets the value of a key in the database.
If you don't specify a value, the named key is deleted. Overwriting
a value may not be visible to all clients until the next full sync.
Options:
--overwrite

Arguments

Baker maps command line options to function parameters in the most natural way
available.

You can group multiple short flag options together (-xvc). You can also
optionally not put a space between a short option and its argument, for
example -nCASE instead of -n CASE.

run() function

The run() function has a few useful options.

argv: the list of options to parse. Default is sys.argv.

main: if True (the default), this function acts like the main function
of the module – it prints errors instead of raising exceptions, prints
the return value of the command function, and exits with an error code on
errors.

help_on_error: if True, when an error occurs, automatically prints
the usage help after the error message. Default is False.

outfile, errorfile, helpfile: the files to use for output,
errors, and usage help. Defaults are stdout, stderr, and stdout.

errorcode: if main=True and this value is not 0, calls sys.exit()
with this code in the event of an error

usage() function

Use the usage() function if you need to print the usage help
programmatically:

# Print overall help
baker.usage()
# Print help for a command
baker.usage("commandname")
# Print to a file
baker.usage("commandname", file=sys.stdout)

Miscellaneous

Instead of baker.run(), you can use baker.test() to print out how
Baker will call your function based on the given command line.

As in many UNIX command line utilities, if you specify a single hyphen
(-) as a bare argument, any subsequent arguments will not parsed as
options, even if they start with --.

Commands are automatically given the same name as the decorated function.
To give a command a different name, use the name keyword on the
decorator. This is especially useful when the command name you want
isn’t a valid Python identifier:

@baker.command(name="track-all")
def trackall():
pass

You can specify a “default” command that is used when the first argument
to the script doesn’t look like a command name: