在python中使用argparser传递子解析器

在python中使用argparser传递子解析器,python,argparse,Python,Argparse,基本上,我想要实现的是: python http_client.py (get|post) [-v] (-h "k:v")* [-d inline-data] [-f file] URL 现在,我所做的是这样的: parser.add_argument('get', help='Get executes a HTTP GET request for a given URL.', default='http://httpbin.org/get') 但它不起作用。我这样做了一些,这些是我尝试的其

基本上,我想要实现的是:

python http_client.py (get|post) [-v] (-h "k:v")* [-d inline-data] [-f file] URL
现在,我所做的是这样的:

parser.add_argument('get', help='Get executes a HTTP GET request for a given URL.', default='http://httpbin.org/get')
但它不起作用。我这样做了一些,这些是我尝试的其他链接,但没有达到预期的输出


此解析器产生类似的用法行:

import argparse

parser = argparse.ArgumentParser(prog='http_client.py')
parser.add_argument("gp", choices=['get','post'])
parser.add_argument('-v', action='version', version='0.0.1')
parser.add_argument('--how', action='append',help='k:v, may repeat')
parser.add_argument('-d', metavar='inline-data')
parser.add_argument('-f','--file')
parser.add_argument('url')

print(parser.parse_args())
有关用法的示例帮助。请注意,位置显示在末尾,但也可能穿插有选项:

1356:~/mypy$ python stack46357414.py -h
usage: http_client.py [-h] [-v] [--how HOW] [-d inline-data] [-f FILE]
                      {get,post} url

positional arguments:
  {get,post}
  url

optional arguments:
  -h, --help            show this help message and exit
  -v                    show program's version number and exit
  --how HOW             k:v, may repeat
  -d inline-data
  -f FILE, --file FILE
我假设您的
-v
应该是版本,尽管
-v
也用于详细标志

1357:~/mypy$ python stack46357414.py -v
0.0.1
get/post示例,几个
how
,以及必需的
url

1357:~/mypy$ python stack46357414.py get --how 3:3 --how a:b aurl
Namespace(d=None, file=None, gp='get', how=['3:3', 'a:b'], url='aurl')
argparse
不会为您解析
k:v
字符串。在解析之后,您就可以这样做了。我假设
(-h“k:v”)*
表示您要输入几个
k:v
nargs='*'
action='append'
的替代方法

我用一个选项定义了简单的
gp
positional。这将输入限制为这两个字符串。到目前为止,在你的描述中,我看不出有必要使用下级检察官



通常
argparse
问题需要完整的
parser
定义,而不仅仅是一行。还显示您正在测试的命令行以及产生的错误。你的
add_参数
到目前为止只定义了一个带有
dest='get'
的位置。虽然
子参数
在文档中有解释(忘记那个链接-它太高级了),但我不知道你所说的
子参数
是什么意思。我看不出
子参数
链接有什么帮助。它要求的不是同一件事。小心那
-h
。默认情况下,解析器已经有了一个
-h
帮助定义。因此,我在访问它的值时遇到了麻烦。这就是我试图为args中的k所做的------>>>。\uuu dict\uuuu:print(k,args.\uu dict\uuk])
In [210]: args=argparse.Namespace(d=None, file=None, gp='get', how=['3:3', 'a:b'
     ...: ], url='aurl')
In [211]: args
Out[211]: Namespace(d=None, file=None, gp='get', how=['3:3', 'a:b'], url='aurl')
In [212]: vars(args)
Out[212]: {'d': None, 'file': None, 'gp': 'get', 'how': ['3:3', 'a:b'], 'url': 'aurl'}
In [213]: for k in args.__dict__:
     ...:     print(k, args.__dict__[k])
     ...:     
file None
d None
url aurl
gp get
how ['3:3', 'a:b']