我怎样才能有 python 中的用法

How can I have a Usage as follow in python

我想知道我怎么会有这样的用法:

Usage: httpclient get [-v] [-h key: value] URL

基本上,现在,我将我的文件命名为httpclient.py,以便我可以通过httpclient调用它,剩下的如下:

def main():
    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument("arg1", nargs='?')
    parser.add_argument("arg2", nargs='?')
    parser.add_argument("-v",  nargs='?')
    parser.add_argument("-h", '--h', nargs='?', action='append')
    args = parser.parse_args()
    if args.arg1 == "help" and (args.arg2 == "get" or args.arg2 == "post"):
        if args.arg2 == "get":
            gethelp()
        elif args.arg2 == "post":
            posthelp()
    elif args.arg1 == "help":
        help()
    elif args.arg1 == "get":
        if args.v:
            print(sys.argv[-1])
            get(args.v,1,args.h)
        else:
            get(sys.argv[2],0,args.h)

所以现在如果我在命令行上执行以下操作:

Py -3 httpclient.py get -v "http://google.com" -h "key: value"

然而,正如您所看到的,url 紧跟在 -v 之后,在任务中,它被要求放在末尾,并且正好是一个 url。

所以每次我写:

Py -3 httpclient.py get -v -h "key: value" "http://google.com"

我得到一个错误:

usage: httpclient.py [-v [V]] [-h [H]] [arg1] [arg2]
httpc.py: error: unrecognized arguments: http://google.com

那么我怎样才能把 URL 放在我的 cmd 行参数的末尾

与:

import argparse

parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("arg1", nargs='?')
parser.add_argument("arg2", nargs='?')
parser.add_argument("-v",  nargs='?')
parser.add_argument("-h", '--h', nargs='?', action='append')

args = parser.parse_args()

parser.print_help()

print(args)

测试运行:

1438:~/mypy$ python stack41863442.py 
usage: stack41863442.py [-v [V]] [-h [H]] [arg1] [arg2]

positional arguments:
  arg1
  arg2

optional arguments:
  -v [V]
  -h [H], --h [H]
Namespace(arg1=None, arg2=None, h=None, v=None)

1526:~/mypy$ python stack41863442.py get -v -h "key: value"
....
Namespace(arg1='get', arg2=None, h=['key: value'], v=None)

1527:~/mypy$ python stack41863442.py get -v -h "key: value" google
usage: stack41863442.py [-v [V]] [-h [H]] [arg1] [arg2]
stack41863442.py: error: unrecognized arguments: google

将第二个位置参数放在第一个作品之后:

1528:~/mypy$ python stack41863442.py get google -v -h "key: value" 
...
Namespace(arg1='get', arg2='google', h=['key: value'], v=None)

A nargs='?' 空列表满足操作。所以 arg2arg1 之后被解析,没有留下任何东西来处理 google.

python stack41863442.py -v -h "key: value" get google

创建相同的命名空间。

注意多个变量 nargs 参数。他们并不总是能很好地合作。

-v 如果给它 constdefault 值会更有用。例如postionals 也有默认值:

1536:~/mypy$ python stack41863442.py 
Namespace(arg1='def1', arg2='def2', h=None, v='vdef')
1536:~/mypy$ python stack41863442.py -v
Namespace(arg1='def1', arg2='def2', h=None, v='vconst')
1536:~/mypy$ python stack41863442.py -v fpp
Namespace(arg1='def1', arg2='def2', h=None, v='fpp')

此处get赋值给-v:

1538:~/mypy$ python stack41863442.py -v get google
Namespace(arg1='google', arg2='def2', h=None, v='get')

对于 verbosity 'switch',store_true 操作可能更好。 count 如果您想使用 -vvv 表示额外的详细信息,也可以使用操作。

我没有注意到-h'append',但我同意另一个答案。这是一个奇怪的组合。没有任何后续参数的 -h 是什么意思?在此测试中,裸 -hNone(默认值)放入 h 列表中。

1540:~/mypy$ python stack41863442.py -h test -h -h 'other;x'
Namespace(arg1='def1', arg2='def2', h=['test', None, 'other;x'], v='vdef')

不清楚为什么要使用 nargs='?' 作为 -v 冗长标志 - 您不应该期望 any 值会为此传递,更不用说 多个 值了。


nargs='?'action='append'结合起来也很奇怪;你想让用户做,例如-h one two (nargs='?') 或 -h one -h two (action='append') 结果 parsed_args.h == ['one', 'two']?

或者,如果您想要 -h 允许用户多次设置,每次使用单独的 keyvalue,那么您想要的是:

parser.add_argument('-h', nargs=2, metavar=('key', 'value'), action='append')

采用两个可选参数后跟一个位置参数并配置显示非常简单:

import argparse

parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-v', action='store_true')
parser.add_argument('-h', metavar='key: value', action='append')
parser.add_argument('URL')

print(parser.parse_args())

得到你:

$ python test.py
usage: test.py [-v] [-h key: value] URL
test.py: error: too few arguments
$ python test.py -h one -h two three
Namespace(URL='three', h=['one', 'two'], v=False)
$ python test.py hello -v
Namespace(URL='hello', h=None, v=True)

要添加单独的 getpost 子命令,请考虑使用 add_subparsers;这将比仅允许用户提供随机输入并比较 == 'get'

更有效

但是,您并不清楚您真正想要的用户界面是什么,因此很难准确地说出您应该如何实现它。