我如何告诉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
一样。
答案 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()
,则输出就像您希望的行为一样。
[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