Python argparse:有没有办法只打印特定参数的帮助?
Python argparse: Is there a way to print help for only a specific parameter?
我有一长串参数,所以 mycommand --help
的输出变得非常大。我想为我的用户提供一种获取特定参数帮助文本的方法。
类似这样的东西(不起作用,显示整个帮助文本)
mycommand --help --parameter-of-interest
如果可以避免,我不想将所有内容都拆分成子解析器。
您可以创建自己的操作来实现此目的。这两个都将迭代可选参数并抑制在 sys.argv
中找不到的任何参数。我推荐解释操作,因为这不会与 -h/--help
标志混淆。
解释操作
这将创建一个操作 ExplainParamsAction
,其中包含相应的 -e/--explain
选项,用于过滤指定参数的帮助文本。
import sys
import argparse
class ExplainParamsAction(argparse.Action):
def __init__(
self,
option_strings,
dest=argparse.SUPPRESS,
default=argparse.SUPPRESS,
**kwargs
):
super().__init__(option_strings, dest, default=default, nargs=0, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
opts = parser._option_string_actions
for arg in opts:
if arg not in sys.argv:
setattr(opts[arg], "help", argparse.SUPPRESS)
parser.print_help()
parser.exit()
parser = argparse.ArgumentParser()
parser.add_argument(
"-e",
"--explain",
action=ExplainParamsAction,
help="Show help message for only specified parameters and exit",
)
parser.add_argument("--url", help="URL to the resource")
parser.add_argument("--port", help="Port to the resource")
parser.add_argument("--timeout", help="Connection timeout")
args = parser.parse_args()
覆盖帮助操作
或者,您可以覆盖提供给解析器的帮助操作。
要与 argparse.ArgumentParser
一起使用,您需要关闭默认助手并提供您自己的助手。
import sys
import argparse
class _CustomHelpAction(argparse._HelpAction):
def __call__(self, parser, namespace, values, option_string=None):
args = sys.argv[1:]
opts = parser._option_string_actions
# Check is needed for just -h/--help to work
if len(args) > 1:
for arg in opts:
if arg not in args:
setattr(opts[arg], "help", argparse.SUPPRESS)
super().__call__(parser, namespace, values, option_string)
# Init parser with help turned off
parser = argparse.ArgumentParser(add_help=False)
# Register your help action and manually add the `-h/--help` option
parser.register("action", "help", _CustomHelpAction)
parser.add_argument("-h", "--help", action="help", help="show this help message and exit")
# Add remaining arguments
parser.add_argument("--url", help="URL to the resource")
parser.add_argument("--port", help="Port to the resource")
parser.add_argument("--timeout", help="Connection timeout")
args = parser.parse_args()
用法示例:
全部帮助:
python3 script.py --help
usage: script.py [-h] [--url URL] [--port PORT] [--timeout TIMEOUT]
optional arguments:
-h, --help
--url URL URL to the resource
--port PORT Port to the resource
--timeout TIMEOUT Connection timeout
具体参数:
~ python3 script.py -h --url --timeout
usage: script.py [--url URL] [--timeout TIMEOUT]
optional arguments:
--url URL URL to the resource
--timeout TIMEOUT Connection timeout
~ python3 script.py -h --timeout --port
usage: script.py [--timeout TIMEOUT] [--port PORT]
optional arguments:
--port PORT Port to the resource
--timeout TIMEOUT Connection timeout
这天真地假设您只使用 sys.argv
,我不确定如果不是,我需要做什么。
这里已经讨论过了:
本质上,您可以通过添加 --help 作为参数来覆盖帮助。
编辑:自定义帮助可以指向获取特定参数帮助的语法,例如 -s parameter_you_wish_help_about.
编辑 2:尚未测试,但大致如此。
parser.add_argument('-s',action='store',dest='para', type=str, help='Get Help on specific parameter')
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, help='Use -s to get help on specific parameter')
help_dict={}
help_dict['para_1']='Help on para_1'
print (help_dict[args.para])
我有一长串参数,所以 mycommand --help
的输出变得非常大。我想为我的用户提供一种获取特定参数帮助文本的方法。
类似这样的东西(不起作用,显示整个帮助文本)
mycommand --help --parameter-of-interest
如果可以避免,我不想将所有内容都拆分成子解析器。
您可以创建自己的操作来实现此目的。这两个都将迭代可选参数并抑制在 sys.argv
中找不到的任何参数。我推荐解释操作,因为这不会与 -h/--help
标志混淆。
解释操作
这将创建一个操作 ExplainParamsAction
,其中包含相应的 -e/--explain
选项,用于过滤指定参数的帮助文本。
import sys
import argparse
class ExplainParamsAction(argparse.Action):
def __init__(
self,
option_strings,
dest=argparse.SUPPRESS,
default=argparse.SUPPRESS,
**kwargs
):
super().__init__(option_strings, dest, default=default, nargs=0, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
opts = parser._option_string_actions
for arg in opts:
if arg not in sys.argv:
setattr(opts[arg], "help", argparse.SUPPRESS)
parser.print_help()
parser.exit()
parser = argparse.ArgumentParser()
parser.add_argument(
"-e",
"--explain",
action=ExplainParamsAction,
help="Show help message for only specified parameters and exit",
)
parser.add_argument("--url", help="URL to the resource")
parser.add_argument("--port", help="Port to the resource")
parser.add_argument("--timeout", help="Connection timeout")
args = parser.parse_args()
覆盖帮助操作
或者,您可以覆盖提供给解析器的帮助操作。
要与 argparse.ArgumentParser
一起使用,您需要关闭默认助手并提供您自己的助手。
import sys
import argparse
class _CustomHelpAction(argparse._HelpAction):
def __call__(self, parser, namespace, values, option_string=None):
args = sys.argv[1:]
opts = parser._option_string_actions
# Check is needed for just -h/--help to work
if len(args) > 1:
for arg in opts:
if arg not in args:
setattr(opts[arg], "help", argparse.SUPPRESS)
super().__call__(parser, namespace, values, option_string)
# Init parser with help turned off
parser = argparse.ArgumentParser(add_help=False)
# Register your help action and manually add the `-h/--help` option
parser.register("action", "help", _CustomHelpAction)
parser.add_argument("-h", "--help", action="help", help="show this help message and exit")
# Add remaining arguments
parser.add_argument("--url", help="URL to the resource")
parser.add_argument("--port", help="Port to the resource")
parser.add_argument("--timeout", help="Connection timeout")
args = parser.parse_args()
用法示例:
全部帮助:
python3 script.py --help
usage: script.py [-h] [--url URL] [--port PORT] [--timeout TIMEOUT]
optional arguments:
-h, --help
--url URL URL to the resource
--port PORT Port to the resource
--timeout TIMEOUT Connection timeout
具体参数:
~ python3 script.py -h --url --timeout
usage: script.py [--url URL] [--timeout TIMEOUT]
optional arguments:
--url URL URL to the resource
--timeout TIMEOUT Connection timeout
~ python3 script.py -h --timeout --port
usage: script.py [--timeout TIMEOUT] [--port PORT]
optional arguments:
--port PORT Port to the resource
--timeout TIMEOUT Connection timeout
这天真地假设您只使用 sys.argv
,我不确定如果不是,我需要做什么。
这里已经讨论过了:
本质上,您可以通过添加 --help 作为参数来覆盖帮助。
编辑:自定义帮助可以指向获取特定参数帮助的语法,例如 -s parameter_you_wish_help_about.
编辑 2:尚未测试,但大致如此。
parser.add_argument('-s',action='store',dest='para', type=str, help='Get Help on specific parameter')
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, help='Use -s to get help on specific parameter')
help_dict={}
help_dict['para_1']='Help on para_1'
print (help_dict[args.para])