New configuration module - interfacing to command line options

Vinay Sajip vinay_sajip at red-dove.com
Wed Nov 3 18:29:44 EST 2004


Neal,
> 
> I believe a decent config module should at least handle both config files
> and command line options.  ENV variables are a nice touch too.
> 
Further to my earlier post, I did a bit of thinking and find it very 
easy to accommodate command line options read via optparse within the 
overall configuration framework. Consider the following hypothetical 
configuration file 'cmdline.cfg':

cmdline_values:
{
   verbose : `cmdline.verbose`
   file: `cmdline.filename`
}
other_config_items:
{
   whatever : 'you want'
}

The values of interest are those provided in the 'cmdline_values' part 
of the configuration. (You can, of course, use whatever structure you 
like - this is only an example.)

Consider the following program:

from optparse import OptionParser
from config import Config

parser = OptionParser()
parser.add_option("-f", "--file",
                 action="store", type="string", dest="filename",
                 help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                 action="store_false", dest="verbose", default=1,
                 help="don't print status messages to stdout")

(options, args) = parser.parse_args()

cfg = Config(file('cmdline.cfg'))
cfg.addNamespace(options, 'cmdline')
print "The verbose option value is %r" % cfg.cmdline_values.verbose
print "The file name is %r" %  cfg.cmdline_values.file

After parsing the command line using OptionParser, we read in the 
configuration (possibly getting the configuration file from the parsed 
options, though not in this case). We also add a namespace called 
'cmdline' which adds the parsed option settings to the configuration. 
When we later reference cfg.cmdline_values.verbose, this references 
`cmdline.verbose`, and this resolves to the 'verbose' attribute of the 
parsed-options object (added under the name 'cmdline'). The program will 
print

The verbose option value is False
The file name is 'test'

as you would expect.

N.B. I had to make a small change to the Config.addNamespace method to 
get this to work. The current release (0.3) does not have this fix, but 
the next release will.

Best regards,



Vinay Sajip



More information about the Python-list mailing list