可选的python参数,不带破折号,但带有附加参数?
我想在Python中做的是接受以下格式的参数:可选的python参数,不带破折号,但带有附加参数?,python,argparse,Python,Argparse,我想在Python中做的是接受以下格式的参数: script.py START | STOP | STATUS | MOVEABS <x> <y> | MOVEREL <x> <y> script.py START | STOP | STATUS | MOVEABS | MOVEREL 换句话说 我不想处理连字符 我有多种可能性,其中一种是必需的 每一个都是相互排斥的 某些命令(例如moveabs和moverel)具有额外的必需参数,但这些参数
script.py START | STOP | STATUS | MOVEABS <x> <y> | MOVEREL <x> <y>
script.py START | STOP | STATUS | MOVEABS | MOVEREL
换句话说
这可以在python中完成吗?我会使用argparse还是其他什么?谢谢。使用
docopt
您可以非常轻松地完成此操作
首先安装docopt
:
编写脚本.py
:
“”“
用法:
script.py(开始|停止|状态| moveabs | moverel)
"""
从docopt导入docopt
如果名称=“\uuuuu main\uuuuuuuu”:
args=docopt(文档)
打印参数
然后运行它:
首先显示基本帮助:
$ python script.py
Usage:
script.py (start | stop | status | moveabs <x> <y> | moverel <x> <y>)
$python script.py
用法:
script.py(开始|停止|状态| moveabs | moverel)
然后尝试子命令:
开始
$python script.py start
{'':无,
'':没有,
“moveabs”:假,
“moverel”:False,
“开始”:正确,
“状态”:False,
“停止”:False}
停止
$python script.py stop
{'':无,
'':没有,
“moveabs”:假,
“moverel”:False,
“开始”:False,
“状态”:False,
“停止”:True}
摩瓦布
$ python script.py moveabs 11 22
{'<x>': '11',
'<y>': '22',
'moveabs': True,
'moverel': False,
'start': False,
'status': False,
'stop': False}
$python script.py moveabs 11 22
{'': '11',
'': '22',
“moveabs”:对,
“moverel”:False,
“开始”:False,
“状态”:False,
“停止”:False}
莫弗雷尔
$ python script.py moverel 11 22
{'<x>': '11',
'<y>': '22',
'moveabs': False,
'moverel': True,
'start': False,
'status': False,
'stop': False}
$python script.py moverel 11 22
{'': '11',
'': '22',
“moveabs”:假,
“moverel”:对,
“开始”:False,
“状态”:False,
“停止”:False}
使用子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
及
及
MOVEREL参数可以命名为
和
,但是您必须通过args[''']
而不是args.y
访问它们metavar='
可用于更改显示,但不能更改命名空间名称
您还可以使用
spp.add_参数('point',nargs=2,type=float)
。不幸的是,有一个bug阻止我们在这个nargs=2
案例中使用metavar。是的。所有这些都记录在这里:@Constantinius的可能重复问题不是关于argparse
。我的回答详细阐述了Canstantinius的“重复”中接受的答案中的次parser用法。argparse
解决方案不会产生不必要的数据字段,因此我发现它更干净、更健壮。
$ python script.py moveabs 11 22
{'<x>': '11',
'<y>': '22',
'moveabs': True,
'moverel': False,
'start': False,
'status': False,
'stop': False}
$ python script.py moverel 11 22
{'<x>': '11',
'<y>': '22',
'moveabs': False,
'moverel': True,
'start': False,
'status': False,
'stop': False}
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')