cmdln.py -- an improved cmd.py

Home http://trentm.com/projects/cmdln/
License MIT (more details at OSI)
Platforms Windows, Linux, Mac OS X, Unix
Current Version 1.1.1
Dev Status well tested; a similar design has been used in various heavily used scripts at ActiveState for a while; some features of this module *are* faily new though
Requirements Python >= 2.3, (Python >= 2.4 to use some features using decorators)
Documentation

Why cmdln.py?

cmdln.py fixes some of the design flaws in cmd.py and takes advantage of new Python stdlib modules (e.g. optparse) so that it is more useful (and convenient) for implementing command-line scripts/shells.

The main differences are:

Install notes and intro docs are below. Please send any feedback to Trent Mick.

Install Notes

Download the latest cmdln.py source package, unzip it, and run python setup.py install:

unzip cmdln-1.1.1.zip
cd cmdln-1.1.1
python setup.py install

If your install fails then please visit the Troubleshooting FAQ.

This will install cmdln.py into your Python's site-packages area. cmdln.py has no external dependencies that aren't part of the Python standard library so, if you like, you may simple copy cmdln.py into your own Python packages.

Introduction

cmdln.py is an extension of Python's default cmd.py module that provides "a simple framework for writing line-oriented command interpreters". The idea (with both cmd.py and cmdln.py) is to be able to quickly build multi-sub-command tools (think cvs or svn) and/or simple interactive shells (think gdb or pdb). cmdln.py's extensions make it more natural to write sub-commands, integrate optparse for simple option processing, and make having good command documentation easier.

For example, here is most of the scaffolding for the svn status command. (Note: Some options were removed and the doc string truncated for brevity. See examples/svn.py for a more complete scaffold re-implementation of the svn command-line interface.)

#!/usr/bin/env python
import sys
import cmdln

class MySVN(cmdln.Cmdln):
    name = "svn"

    @cmdln.alias("stat", "st")
    @cmdln.option("-u", "--show-updates", action="store_true",
                  help="display update information")
    @cmdln.option("-v", "--verbose", action="store_true",
                  help="print extra information")
    def do_status(self, subcmd, opts, *paths):
        """${cmd_name}: print the status of working copy files and directories

        ${cmd_usage}
        ${cmd_option_list}
        """
        print "'svn %s' opts:  %s" % (subcmd, opts)
        print "'svn %s' paths: %s" % (subcmd, paths)


if __name__ == "__main__":
    svn = MySVN()
    sys.exit(svn.main())

The base cmdln.Cmdln class is providing a number of things for free here. (1) There is a reasonable default help string:

$ python svn.py
Usage:
    svn COMMAND [ARGS...]
    svn help [COMMAND]

Commands:
    help (?)            give detailed help on a specific command
    status (st, stat)   print the status of working copy files and dire...

(2) A default help command is provided for getting detailed help on specific sub-commands. This is how many such tools already work (e.g. svn and p4, the command-line interface for the Perforce source control system).

$ python svn.py help status
status (stat, st): print the status of working copy files and directories.

Usage:
    svn status [PATHS...]

Options:
    -h, --help          show this help message and exit
    -v, --verbose       print extra information
    -u, --show-updates  display update information

(3) It makes parsing the command line easy (with optparse integration):

$ python svn.py status -v foo bar baz
'svn status' opts:  {'show_updates': None, 'verbose': True}
'svn status' paths: ('foo', 'bar', 'baz')

and (4) defining command aliases easy:

$ python svn.py st -v foo bar baz
'svn st' opts:  {'show_updates': None, 'verbose': True}
'svn st' paths: ('foo', 'bar', 'baz')

Read the Getting Started docs next.

Change Log

v1.1.1

v1.0.0

v0.8.3

v0.8.2

v0.8.1

v0.8.0