[英]argparse - Reproduce behavior of “--help” argument with a specific argument
I have some trouble while working with the argparse
module for Python v2.7. 使用Python v2.7的
argparse
模块时遇到一些麻烦。 Basically, what I have is a script that works with 5 mandatory arguments : 基本上,我拥有的脚本可以使用5个强制参数:
An example of the syntax would look like this : 语法示例如下所示:
script.py -w/--url [URL] -m/--method [METHOD] -l/--login [LOGIN] -p/--password [PASSWORD] -o/--output [OUTPUT]
script.py -w /-URL [URL] -m /-方法[METHOD] -l /-登录[LOGIN] -p /-密码[PASSWORD] -o /-输出[OUTPUT]
What I'd like to do is this : 我想做的是这样的:
-t/--test
-t/--test
-w/--url
argument, it would bypass completely the -m/--method
, -l/--login
and -p/--password
arguments but, for it to work, I need to tell argparse
to stop processing arguments if -t/--test
is provided (but only with -w/--url
). -w/--url
参数一起使用的-w/--url
,它将完全绕过-m/--method
, -l/--login
和-p/--password
参数,但是,对于它可以正常工作,如果提供了-t/--test
argparse
(但仅适用于-w/--url
),我需要告诉argparse
停止处理参数。 Is this behavior even possible? 这种行为甚至可能吗? I tried to play with
argparse
sub-commands but it seems to be (at least to my small knowledge) a bit overkill. 我尝试使用
argparse
子命令,但(至少据我所知)似乎有点过大。
NB: Here is my original code : 注意:这是我的原始代码:
# Description : parses script arguments
# Argument(s) : all
# Return value : all arguments values
def testArgs():
parser = argparse.ArgumentParser(description='Foo', formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('-w','--url', help='URL', required=True)
parser.add_argument('-t','--test', help='Test command', action='store_true')
parser.add_argument('-m','--method', help='METHOD', required=True)
parser.add_argument('-u','--login_name', help='LOGIN', required=True)
parser.add_argument('-p','--login_password', help='PASSWORD', required=True)
parser.add_argument('-o','--output_format', help='OUTPUT', required=True, choices=['json', 'yaml', 'python'], default='json')
args = parser.parse_args()
return args
EDIT : After a lot of testing, I have managed the following : 编辑:经过大量的测试,我已经管理了以下内容:
def testArgs():
parser = argparse.ArgumentParser(description='DESCRIPTION')
subparsers = parser.add_subparsers()
p_list = subparsers.add_parser('test', help='List all available methods')
p_list.add_argument('-w', help='URL', required=True)
p_list.add_argument('-t', help='Test', action='store_true', required=True)
p_cmd = subparsers.add_parser('cmd', help='Executes command')
p_cmd.add_argument('-w', help='URL', required=True)
p_cmd.add_argument('-m', help='Method', required=True)
p_cmd.add_argument('-l', help='Login', required=True)
p_cmd.add_argument('-p', help='Password', required=True)
p_cmd.add_argument('-o', help='Output', required=True)
args = parser.parse_args()
return args
Which exhibits the following behavior : 表现出以下行为:
$ python testArgparse.py -h
usage: testArgeparse.py [-h] {test,cmd} ...
DESCRIPTION
positional arguments:
{test,cmd}
test Lists all available methods
cmd Executes command
optional arguments:
-h, --help show this help message and exit
But to access help on the others arguments, I need to do the following : 但是要获得有关其他参数的帮助,我需要执行以下操作:
$ python testArgparse.py test -h
usage: testArgparse.py test [-h] -w W -t
optional arguments:
-h, --help show this help message and exit
-w W URL
-t Test
$ python testArgparse.py cmd -h
usage: testArgparse.py cmd [-h] -w W -m M -l L -p P -o O
optional arguments:
-h, --help show this help message and exit
-w W URL
-m M Method
-l L Login
-p P Password
-o O Output
I'd like to be able to, at least, display help about all arguments without having to use --help
for both test
and cmd
arguments. 我希望至少能够显示所有参数的帮助,而不必对
test
和cmd
参数都使用--help
。
Ideally, what I'd like is this behavior : 理想情况下,我想要的是这种行为:
$ python testArgparse.py [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]
required=True
with store_true
does not make sense. required=True
与store_true
。 The default is False
, but if it is required the returned value will always be True
. 默认值为
False
,但是如果需要,则返回的值将始终为True
。
Since only -w
is required unconditionally, I would drop the required
parameter on everything else. 由于仅
-w
是无条件的要求,因此我将在所有其他内容上删除required
参数。 Then test for the required values after parse_args
. 然后在
parse_args
之后测试所需的值。 I can still issue an argparse
error with usage at that time. 到那时我仍然可以发出
argparse
错误。 In other words, do my own testing rather than try something fancy in argparse. 换句话说,请自己进行测试,而不要尝试使用argparse。
def testArgs():
usage = '[-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]'
parser = argparse.ArgumentParser(description='DESCRIPTION',usage=usage)
parser.add_argument('-w', help='URL', required=True)
parser.add_argument('-t', help='Test', action='store_true')
parser.add_argument('-m', help='Method')
parser.add_argument('-l', help='Login')
parser.add_argument('-p', help='Password')
parser.add_argument('-o', help='Output')
args = parser.parse_args()
# sample test, streamline and refine to suit your needs
# this assumes the default for all these args is None
if not args.t: # '-t' in in argv
if any([args.m is None, args.l is None, args.p is None, args.o is None]):
parser.error('m,l,p,o are all required')
return args
1216:~/mypy$ python2.7 stack21070971.py
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]
stack21070971.py: error: argument -w is required
1213:~/mypy$ python2.7 stack21070971.py -w url
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]
stack21070971.py: error: m,l,p,o are all required
1213:~/mypy$ python2.7 stack21070971.py -w url -t
Namespace(l=None, m=None, o=None, p=None, t=True, w='url')
1214:~/mypy$ python2.7 stack21070971.py -w url -m mmm
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]
stack21070971.py: error: m,l,p,o are all required
...
1215:~/mypy$ python2.7 stack21070971.py -w url -m mmm -l uuu -p ppp -o ooo
Namespace(l='uuu', m='mmm', o='ooo', p='ppp', t=False, w='url')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.