在 python 中使用 argparser 传递子解析器
Passing Sub-parsers with argparser in python
基本上我想要实现的是:
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')
但它不起作用。我做了一些 SO,这些是我尝试过但未达到所需输出的其他链接
Python argparse optional sub-arguments
How to have sub-parser arguments in separate namespace with argparse?
此解析器生成类似的用法行:
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
位置。这将输入限制为这 2 个字符串。到目前为止,在您的描述中,我认为不需要子解析器。
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']
基本上我想要实现的是:
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')
但它不起作用。我做了一些 SO,这些是我尝试过但未达到所需输出的其他链接
Python argparse optional sub-arguments
How to have sub-parser arguments in separate namespace with argparse?
此解析器生成类似的用法行:
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
位置。这将输入限制为这 2 个字符串。到目前为止,在您的描述中,我认为不需要子解析器。
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']