像-h一样处理可选参数

时间:2016-06-01 09:23:19

标签: python python-2.7 argparse

我如何告诉argparse处理可选参数,就像-h--help一样?

test.py

def test():
    print '## This is my test'

import argparse
parser = argparse.ArgumentParser(prog='test.py')
parser.add_argument('-t', '--test', action='store_true',
                    help='Should work just like "-h", "--help"')
parser.add_argument('req',
                    help='Otherwise required')

args = parser.parse_args()

if args.test:
    test()

if args.req:
    print '## Found "req"'

#python test.py -h

usage: test.py [-h] [-t] req

positional arguments:
  req         Otherwise required

optional arguments:
  -h, --help  show this help message and exit
  -t, --test  Should work just like "-h", "--help"

#python test.py -t

usage: test.py [-h] [-t] req
test.py: error: too few arguments

#python test.py -t test

## This is my test
## Found "req"

#python test.py test

## Found "req"

我想,如果-t--test被指定,argparse就会停在此处,就像-h--help一样。

3 个答案:

答案 0 :(得分:2)

退出功能的帮助在argparse._HelpAction __call__方法中定义。

class _HelpAction(Action):
    def __init__(self,
                 option_strings,
                 dest=SUPPRESS,
                 default=SUPPRESS,
                 help=None):
        super(_HelpAction, self).__init__(
            option_strings=option_strings,
            dest=dest,
            default=default,
            nargs=0,
            help=help)

    def __call__(self, parser, namespace, values, option_string=None):
        parser.print_help()
        parser.exit()  # it exists here

您必须使用help操作:

parser.add_argument('-t', '--test', action='help',
                    help='Should work just like "-h", "--help"')

或者创建自定义argparse操作。

class MyCustomAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print("argument found, I should exit")
        self.exit()

parser.add_argument('-t', '--test', action= MyCustomAction,
                    help='Should work just like "-h", "--help"')

有关创建自定义操作的详细信息,请参阅docs

答案 1 :(得分:1)

最后一个位置参数的参数未正确初始化以达到您想要的效果。

parser.add_argument('req', nargs='?', default="truc", help='Otherwise required')

请查看Python文档以获取更多详细信息。但基本上,nargs='?'提供了可选的位置参数的可能性。但是你需要提供一个默认值。

#python test.py -t

## This is my test
## Found "req"

Ž。

答案 2 :(得分:0)

更简单的解决方案,定义nargs

parser.add_argument('req', nargs='?',
                    help='Otherwise required')

?表示0或更多。

然后在运行测试后退出:

import sys

if args.test:
    test()
    sys.exit()

完整的代码:

import sys

def test():
    print '## This is my test'

import argparse
parser = argparse.ArgumentParser(prog='test.py')
parser.add_argument('-t', '--test', action='store_true',
                    help='Should work just like "-h", "--help"')
parser.add_argument('req', nargs='?',
                    help='Otherwise required')

args = parser.parse_args()

if args.test:
    test()
    sys.exit()

if args.req:
    print '## Found "req"'

输出:

[8] oz123@laptop-oz:~ $ python bla.py -t
## This is my test
[9] oz123@laptop-oz:~ $ python bla.py -h
usage: test.py [-h] [-t] [req]

positional arguments:
  req         Otherwise required

optional arguments:
  -h, --help  show this help message and exit
  -t, --test  Should work just like "-h", "--help"
[10] oz123@laptop-oz:~ $ python bla.py bla
## Found "req"

更新,没有sys.exit

如果删除sys.exit(),则输出就像您希望的行为一样。

[12] oz123@laptop-oz:~ $ python bla.py -t bla
## This is my test
## Found "req"
[13] oz123@laptop-oz:~ $ python bla.py -t 
## This is my test