簡體   English   中英

可選的python參數沒有破折號但有附加參數?

[英]optional python arguments without dashes but with additional parameters?

我想在Python中做的是接受以下格式的參數:

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

換句話說,

  1. 我不想處理連字符;
  2. 我有多種可能性,其中一種是必需的;
  3. 每個都是互相排斥的;
  4. 一些命令(EG moveabs和moverel)具有額外的必需參數,但這些參數不應與任何其他參數一起出現。

這可以在python中完成,我會使用argparse還是別的? 謝謝。

使用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}

add_parser和subparsers可以解決問題

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')

MOVEREL參數可以命名為<x><y> ,但是你必須通過args['<y>']而不是args.y來訪問它們。 metavar='<x>'可用於更改顯示但不能更改命名空間名稱。

你也可以使用spp.add_argument('point', nargs=2, type=float) 不幸的是,有一個錯誤阻止我們在這個nargs=2案例中使用metavar, http: nargs=2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM