简体   繁体   English

argparse-使用特定参数重现“ --help”参数的行为

[英]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个强制参数:

  1. url 网址
  2. method 方法
  3. login 登录
  4. password 密码
  5. output 产量

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 : 我想做的是这样的:

  • add an optional argument -t/--test 添加可选参数-t/--test
  • its behavior would be that, based on the url used with the -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. 我希望至少能够显示所有参数的帮助,而不必对testcmd参数都使用--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=Truestore_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM