Creating Dynamic Command Line Options from Python Egg Plugins
Has anyone created a command line tool, using optparse, that dynamically creates options from available eggs/plugins? I have a need to create such a tool, and was looking for an example. Noah Gift
Noah Gift wrote:
Has anyone created a command line tool, using optparse, that dynamically creates options from available eggs/plugins? I have a need to create such a tool, and was looking for an example.
Yeah, I did something like this, which is somewhat clunky: def parse_options(args): usage = """%prog [OPTION...] MODEL SEQFILE OUTFILE %prog [OPTION...] --driver=DRIVER MODEL SEQFILE [DRIVEROPTIONS...]""" version = "%%prog %s" % __version__ parser = OptionParser(usage=usage, version=version) parser.disable_interspersed_args() with OptionGroup(parser, "Output driver") as group: group.add_option("-d", "--driver", default="DEFAULT", help="set output format") group.add_option("--driver-help", action="store_true", help="get driver-specific help") options, args = parser.parse_args(args) if options.driver_help: driver_class = driver_load(options.driver) driver_class.print_help() sys.exit(0) def driver_load(name): return load_entry_point("myproject", "myproject.drivers", name) And I defined the entry points in my setup.py file: ==== [myproject.drivers] DEFAULT = myproject.driver.hdf5:HDF5Driver hdf5 = myproject.driver.hdf5:HDF5Driver sql = myproject.driver.sql:SQLDriver ==== At some point I pass unprocessed args to the entry point, which parse them with optparse. I could call the program like this: myproject --driver=sql model seqfile --database=server.example.net
On Feb 20, 2008, at 8:13 PM, Michael Hoffman wrote:
Noah Gift wrote:
Has anyone created a command line tool, using optparse, that dynamically creates options from available eggs/plugins? I have a need to create such a tool, and was looking for an example.
Thanks Michael. That gives me some good ideas to start with!
Yeah, I did something like this, which is somewhat clunky:
def parse_options(args): usage = """%prog [OPTION...] MODEL SEQFILE OUTFILE %prog [OPTION...] --driver=DRIVER MODEL SEQFILE [DRIVEROPTIONS...]""" version = "%%prog %s" % __version__ parser = OptionParser(usage=usage, version=version) parser.disable_interspersed_args()
with OptionGroup(parser, "Output driver") as group: group.add_option("-d", "--driver", default="DEFAULT", help="set output format")
group.add_option("--driver-help", action="store_true", help="get driver-specific help")
options, args = parser.parse_args(args)
if options.driver_help: driver_class = driver_load(options.driver) driver_class.print_help() sys.exit(0)
def driver_load(name): return load_entry_point("myproject", "myproject.drivers", name)
And I defined the entry points in my setup.py file:
==== [myproject.drivers] DEFAULT = myproject.driver.hdf5:HDF5Driver hdf5 = myproject.driver.hdf5:HDF5Driver sql = myproject.driver.sql:SQLDriver ====
At some point I pass unprocessed args to the entry point, which parse them with optparse. I could call the program like this:
myproject --driver=sql model seqfile --database=server.example.net
_______________________________________________ Distutils-SIG maillist - Distutils-SIG@python.org http://mail.python.org/mailman/listinfo/distutils-sig
Noah Gift / http://noahgift.com [Python+Grok+AJAX+Mashup]
Michael Hoffman wrote:
with OptionGroup(parser, "Output driver") as group: group.add_option("-d", "--driver", default="DEFAULT", help="set output format")
group.add_option("--driver-help", action="store_true", help="get driver-specific help")
I forgot that this bit requires making an OptionGroup wrapper. from optparse import OptionGroup as _OptionGroup class OptionGroup(_OptionGroup): def __enter__(self): return self def __exit__(self, *exc_info): self.parser.add_option_group(self) Also I have been thinking about this and I think the way I did it is clunkier than necessary. Better would be to do two passes of optparse--one to figure out what plugins to load, then load their options into the OptionParser, and parse the options again. This would require special handling for help and option conflicts, but would be a better user experience.
participants (2)
-
Michael Hoffman
-
Noah Gift