如何在python中使用如下的用法

时间:2017-01-25 23:16:11

标签: python argparse sys

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

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行参数的末尾

2 个答案:

答案 0 :(得分:1)

使用:

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)

空列表满足nargs='?'操作。因此,在arg2之后立即解析arg1,无需处理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'切换',store_true操作可能会更好。如果您想使用count来表示额外的详细信息,也可以使用-vvv操作。

我没有注意到-h'追加',但我同意另一个答案。这是一个奇怪的组合。没有任何后续参数的-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')

答案 1 :(得分:1)

目前尚不清楚为什么使用nargs='?'来表示-v erbosity标志 - 你不应该期望任何值传递给它,更不用说多个值。

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

或者,如果您想要-h的内容是允许用户多次设置,每次都有一个单独的keyvalue,那么您想要的是:< / p>

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'

更有效

然而,目前还不清楚你真正想要的用户界面是什么,所以很难准确地说明你应该如何实现它。