2017-01-25 14 views
0

我不知道我怎么会我有这样的用法:怎样才可以有一个使用如下的蟒蛇

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 

所以,我怎么可以把网址在我的CMD行参数结束

+0

我不清楚你在问什么,但看起来你应该使用'get'和'post'和'action ='store_true''作为子分析器来处理任何'-v'(详细?)为什么标志出现在URL之前或之后? – jonrsharpe

+0

-v基本上是详细的,如果我们添加'-v'输出将显示我们的获取请求的标题,如果你不把'-v',那么你将只有html响应... – puzzle

回答

1

目前尚不清楚为什么你使用nargs='?'-v erbosity标志 - 你不应该期望任何值获得通过对于这一点,更不用说多个值。


而且很奇怪既nargs='?'action='append'结合;你希望用户做什么-h one twonargs='?')或-h one -h twoaction='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'

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

+0

是的-h我希望能够做'-h hello:World -h world:hello'和'-h hello:world world:hello '和其余的谢谢,这一切都是有道理的 – puzzle

+0

@puzzle不允许,这会给解析添加很多开销。如果你制作的界面是'-h hello world -h world hello',那么'argparse'可以为你做所有的工作,给出'[['hello','world'],['world','hello'] ]'不必介入。另外,请注意http://stackoverflow.com/help/someone-answers – jonrsharpe

+0

我想知道,作为我的第一个参数,我可以帮助,获得和发布,如果我有帮助,我只能得到或发布后,这样的 'httpclient help'会提供一个广泛的帮助部分 和 'httpclient help get'或'httpclient help post'会给出更准确的帮助。 这是可能的子分析器?如果是的话我将如何执行? – puzzle

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='?'行动是由一个空表满意。所以arg2arg1之后被解析,没有处理google

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

创建相同的命名空间。

小心使用多个变量nargs参数。他们并不总是很好地合作。

如果将constdefault的值给出,-v将会更有用。例如用默认的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行动可能会更好。如果您想使用-vvv来标示额外的详细信息,则还会使用count操作。

我没有注意到-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') 
+0

谢谢为解释,因为这很好地解释了我所遇到的问题 – puzzle