不带破折号但带附加参数的可选python参数



我想在Python中做的是接受以下格式的参数:

script.py START | STOP | STATUS | MOVEABS <x> <y> | MOVEREL <x> <y>

换句话说,

  1. 我不想处理连字符
  2. 我有多种可能性,其中一种是必需的
  3. 每一个都是相互排斥的
  4. 有些命令(例如moveabs和moverel)有额外的必需参数,但这些参数不应与任何其他参数一起出现

这可以在python中完成吗?我会使用argparse还是其他什么?谢谢

add_parser和子分析器可以完成

import argparse
parser = argparse.ArgumentParser(prog='script.py')
sp = parser.add_subparsers(dest='cmd')
for cmd in ['START', 'STOP', 'STATUS']:
    sp.add_parser(cmd)
for cmd in ['MOVEABS', 'MOVEREL']:
    spp = sp.add_parser(cmd)
    spp.add_argument('x', type=float)
    spp.add_argument('y', type=float)
parser.print_help()
args = parser.parse_args()
print(args)

生产类似的:

2137:~/mypy$ python2.7 stack23304740.py MOVEREL -h
usage: script.py [-h] {START,STOP,STATUS,MOVEABS,MOVEREL} ...
positional arguments:
  {START,STOP,STATUS,MOVEABS,MOVEREL}
optional arguments:
  -h, --help            show this help message and exit
usage: script.py MOVEREL [-h] x y
positional arguments:
  x
  y
optional arguments:
  -h, --help  show this help message and exit

2146:~/mypy$ python2.7 stack23304740.py MOVEREL 1.0 2.0
...
Namespace(cmd='MOVEREL', x=1.0, y=2.0)

2147:~/mypy$ python2.7 stack23304740.py START
...
Namespace(cmd='START')

MOVREL参数可以命名为<x><y>,但您必须通过args['<y>']而不是args.y来访问它们。metavar='<x>'可用于更改显示,但不能更改命名空间名称。

您也可以使用spp.add_argument('point', nargs=2, type=float)。不幸的是,在nargs=2的情况下,有一个错误使我们无法使用metavar,http://bugs.python.org/issue14074.

使用docopt可以很容易地做到这一点。

首先安装docopt

$ pip install docopt

编写script.py:

"""
Usage:
    script.py (start | stop | status | moveabs <x> <y> | moverel <x> <y>)
"""
from docopt import docopt
if __name__ == "__main__":
    args = docopt(__doc__)
    print args

并运行它:

首次显示基本帮助:

$ python script.py
Usage:
    script.py (start | stop | status | moveabs <x> <y> | moverel <x> <y>)

然后尝试子命令:

启动

$ python script.py start
{'<x>': None,
 '<y>': None,
 'moveabs': False,
 'moverel': False,
 'start': True,
 'status': False,
 'stop': False}

停止

$ python script.py stop
{'<x>': None,
 '<y>': None,
 'moveabs': False,
 'moverel': False,
 'start': False,
 'status': False,
 'stop': True}

moveabs

$ python script.py moveabs 11 22
{'<x>': '11',
 '<y>': '22',
 'moveabs': True,
 'moverel': False,
 'start': False,
 'status': False,
 'stop': False}

moverel

$ python script.py moverel 11 22
{'<x>': '11',
 '<y>': '22',
 'moveabs': False,
 'moverel': True,
 'start': False,
 'status': False,
 'stop': False}

相关内容

  • 没有找到相关文章

最新更新