The Argparse Extension provides the ArgparseArgumentHandler
for argument parsing, and the ArgparseController
for runtime dispatch. Both are the defaults used by Cement.
Documentation References:
​Arguments​
​Controllers​
API References
​Python Argparse Module​
Python 2.7+, 3+
Some features of ArgparseController are only available in Python 3 including controller and function/command aliases (Python 3+) and controller default functions/commands (Python 3.4+).
This extension does not rely on any application level configuration settings or meta options.
The following is an example application using both the ArgparseArgumentHandler
and ArgparseController
. Note that the default arg_handler
is already set toArgparseArgumentHandler
by App
.
from cement import App, Controller, ex​class Base(Controller):class Meta:label = 'base'arguments = [(['--base-foo'],{'help': 'base foo option'}),]​@ex(hide=True)def default(self):print('Inside Base.default')​if self.app.pargs.base_foo:# do something with self.app.pargs.base_fooprint('Base Foo > %s' % self.app.pargs.base_foo)​@ex(arguments=[(['--command1-opt'],{'help': 'option under command1','action': 'store_true'})],aliases=['cmd1'],help='sub-command under myapp base controller',)def command1(self):print('Inside Base.command1')​if self.app.pargs.command1_opt:# do something with self.app.pargs.command1_optpass​class Embedded(Controller):class Meta:label = 'embedded_controller'stacked_on = 'base'stacked_type = 'embedded'​@expose(help="embedded under base controller")def command2(self):print('Inside Embedded.command2')​class Nested(Controller):class Meta:label = 'nested_controller'stacked_on = 'base'stacked_type = 'nested'arguments = [(['--nested-opt'],{'help': 'option under nested-controller'}),]​@expose(help="sub-command under nested-controller")def command3(self):print('Inside Nested.command3')​class MyApp(App):class Meta:label = 'myapp'handlers = [Base,Embedded,Nested,]​with MyApp() as app:app.run()
$ python myapp.py --helpusage: myapp.py [-h] [--quiet] [--base-foo BASE_FOO]{nested-controller,command1,cmd1,default,command2} ...​optional arguments:-h, --help show this help message and exit--quiet suppress all output--base-foo BASE_FOO base foo option​sub-commands:{nested-controller,command1,cmd1,default,command2}nested-controller nested-controller controllercommand1 (cmd1) command1 is a sub-command under base controllercommand2 command2 embedded under base controller​​$ python myapp.py --base-foo barInside Base.defaultBase Foo > bar​​$ python myapp.py command1 --helpusage: myapp.py command1 [-h] [--command1-opt]​optional arguments:-h, --help show this help message and exit--command1-opt option under command1​​$ python myapp.py command1Inside Base.command1​​$ python myapp.py command2Inside Embedded.command2​​$ python myapp.py nested-controller --helpusage: myapp.py nested-controller [-h] [--nested-opt] {command3} ...​optional arguments:-h, --help show this help message and exit--nested-opt option under nested-controller​sub-commands:{command3}command3 command3 under nested-controller​​$ python myapp.py nested-controller command3Inside Nested.command3