Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用argparse隐藏选定的子命令_Python_Argparse - Fatal编程技术网

Python 使用argparse隐藏选定的子命令

Python 使用argparse隐藏选定的子命令,python,argparse,Python,Argparse,我正在使用argparse,并为我的程序设置了子命令。我已经创建了子解析器来定义这些子命令。我有一些不应该在帮助屏幕中显示给用户的管理命令。我知道我们可以隐藏sub命令的参数,但我不知道如何隐藏一些子命令,使其不显示在帮助列表中 这是我的代码片段 parser = argparse.ArgumentParser(prog='myProg', description=desc,

我正在使用argparse,并为我的程序设置了子命令。我已经创建了子解析器来定义这些子命令。我有一些不应该在帮助屏幕中显示给用户的管理命令。我知道我们可以隐藏sub命令的参数,但我不知道如何隐藏一些子命令,使其不显示在帮助列表中

这是我的代码片段

parser = argparse.ArgumentParser(prog='myProg',
                                    description=desc,
                                   formatter_class=argparse.RawDescriptionHelpFormatter)

subparsers = parser.add_subparsers(dest='sub_parser_name')


myProg_query.add_subparser(subparsers)
myProg_update.add_subparser(subparsers)
myProg_configure.add_subparser(subparsers)
myProg_result.add_subparser(subparsers)
当我运行help命令时,我得到

%> myProg --help
usage: myProg [-h] 

positional arguments:
{query,update,configure,result}
query               query information
update              Update 
configure           Configure system
result              tabulate the result

在帮助输出中,我只想向用户显示“查询”和“结果”。我尝试在add_subparser方法中使用argparse.SUPPRESS,但它会隐藏所有子命令。我搜索的内容只涉及隐藏每个子命令的单个参数,而不涉及隐藏子命令。我可能必须创建一个自定义格式化程序方法,但想检查是否有其他方法可以实现此目的。

metavar
可能会实现以下目的:

import argparse
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(metavar='{cmd1,cmd2}')
sp1 = sp.add_parser('cmd1')
sp2 = sp.add_parser('cmd2')
sp3 = sp.add_parser('cmd3')
parser.parse_args()
使用此
cmd3时,
不会出现在用法或帮助中。但它确实出现在错误消息中

错误:参数{cmd1,cmd2}:无效选择:“cmd”(从“cmd1”、“cmd2”、“cmd3”中选择)


您可能已经发现了
help=SUPPRESS
的这种用法。但它需要一个自定义的用法(可能还有描述)参数:

import argparse
parser = argparse.ArgumentParser(usage='%(prog)s [-h] {cmd1,cmd2}')
sp = parser.add_subparsers(help=argparse.SUPPRESS)
sp1 = sp.add_parser('cmd1')
sp2 = sp.add_parser('cmd2')
sp3 = sp.add_parser('cmd3')
parser.parse_args()
对于主解析器来说,子解析器看起来像位置参数的选择。据我所知,没有一种方法可以选择性地抑制
选择


对于这一级别的问题,检查
argparse.py
代码本身比检查文档更有帮助。在本例中,我查看了
class\u subparseraction(Action)
的代码。如果您想自定义格式化程序,这一点就更加正确了。现有的替代格式化程序只修改深埋在类中的一个或两个方法


此问题已作为错误问题提出


有一个补丁可以根据单个子parser的
help=SUPPRESS
修改选项显示。但我推荐的是
metavar
解决方案,至少目前是这样。还有其他建议的补丁用于处理
选择

看起来我找到了一个解决这个问题的解决方案,没有任何argparse补丁。 只需修改“metavar”,而不为特定子Parser设置“help”

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='commands', metavar='{command}')

command = subparsers.add_parser("command",
                                help='command help.',
                                description='command description.')
suppress_command = subparsers.add_parser("suppress_command",
                                         help=argparse.SUPPRESS,
                                         description='suppress command.')
hidden_command = subparsers.add_parser("hidden_command",
                                       description='Hidden command.')
这导致

[root@localhost ~]# parser -h
usage: parser [-h] {command} ...

optional arguments:
-h, --help        print help message and exit

commands:
{command}
    command           command help.
    suppress_command  ==SUPPRESS==

[root@localhost ~]# parser hidden_command -h
usage: parser hidden_command [-h]

Hidden command.

optional arguments:
-h, --help  show this help message and exit

您可以通过覆盖argparse.ArgumentParser类中的一些方法来实现这一点,阅读源代码并检查执行此操作的方法,可能是print_help()、print_usage()、format_help()等。您可以在类内覆盖。或者模块,不幸的是,某些方法名仍然将`suppress_command==suppress==`放在输出中