2013-02-17 78 views
3

我已经做了很多操作的Python脚本,所以它有很多选项,所以我将它划分为也使用父解析器进行常见选项分组的子分析器。如何在argparse中显示所有子分析器的帮助?

我想要一个帮助选项,将显示所有命令的帮助与他们的选项,有没有可能不覆盖format_help方法?

我看到一个similar question,但分组对我来说并不重要,我只想要那里的选项。

例如:

general_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False) 
general_group.add_argument('--threads', action='store_true', default=False) 
second_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False) 
second_group.add_argument('--sleep', action='store', default=60, type=int) 
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) 
subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[general_group,second_group]) 
subparsers.add_parser('Start',parents=[general_group]) 

args = parser.parse_args() 

在这种情况下,我想,如果有人运行./script.py -h他们会看到在帮助线程选项。

+2

是否有一个原因,为什么你逝去'parents'参数分析器?使用'general_group'作为“父”(意思是'subparsers = general_group.add_subparsers()')和* not *传递'parents = [']''''''时会​​显示* --threads'选项./ script.py -h'。 – Bakuriu 2013-02-17 08:39:03

+0

是的,我有3个这样的团体...... – 2013-02-17 08:53:41

+0

那么你发布的不是一个最小的工作示例。发布一些代码,显示你正在尝试做什么。 – Bakuriu 2013-02-17 09:44:31

回答

4

的问题是,在线路:

subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[general_group,second_group]) 
subparsers.add_parser('Start',parents=[general_group]) 

你加入general_group父到subparsers,所以主分析器并不知道这些,这将导致./script.py -h不显示--threads。如果你打算把它作为所有subparsers的父母,那么你应该把它作为顶级解析器父:

parser = argparse.ArgumentParser(parents=[general_group]) 
subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[second_group]) 
subparsers.add_parser('Start') 

其中在结果:但是那

$ python script.py -h 
usage: script.py [-h] [--threads] {Restart,Start} ... 

positional arguments: 
    {Restart,Start} 

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

注意,在这种情况下,选择是部分只有父解析器,而不是subparsers,这意味着以下内容:

$python script.py --threads Start 

是正确的,而:

$ python script.py Start --threads 
usage: script.py [-h] [--threads] {Restart,Start} ... 
script.py: error: unrecognized arguments: --threads 

因为--threads没有被子分析器“继承”。如果你想有--threads也是在子分析器必须在其parents参数指定:

parser = argparse.ArgumentParser(parents=[general_group]) 
subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[general_group, second_group]) 
subparsers.add_parser('Start', parents=[general_group]) 

这应该做你想要什么:

$ python script.py -h 
usage: script.py [-h] [--threads] {Restart,Start} ... 

positional arguments: 
    {Restart,Start} 

optional arguments: 
    -h, --help  show this help message and exit 
    --threads 
$ python script.py Start -h 
usage: script.py Start [-h] [--threads] 

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

听起来像它回答我的问题,我会测试它,如果它的工作,我会标记你的答案被接受,同时投票。 – 2013-02-18 09:44:23

相关问题