Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可选的python参数,不带破折号,但带有附加参数?_Python_Argparse - Fatal编程技术网

可选的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)具有额外的必需参数,但这些参数

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

script.py START | STOP | STATUS | MOVEABS <x> <y> | MOVEREL <x> <y>
script.py START | STOP | STATUS | MOVEABS | MOVEREL
换句话说

  • 我不想处理连字符
  • 我有多种可能性,其中一种是必需的
  • 每一个都是相互排斥的
  • 某些命令(例如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')