如何解决子命令中 -h/--help 的 ArgumentParser 冲突?

问题描述 投票:0回答:1

我正在开发一个 Python 命令行工具,使用 argparse 和多个模块,每个模块都有自己的一组参数。我使用单独的类来定义每个模块的参数并将它们集成到主脚本中。但是,我遇到了一个问题,即在运行子命令的帮助命令时,

-h/--help
参数发生冲突。

这是我的设置的简化版本:

fastp_arguments.py:

import argparse

class FastpArguments:
    def __init__(self, args=None):
        self.parser = argparse.ArgumentParser(description="fastp arguments.", add_help=False)
        self.args = args if args is not None else []
        self._initialize_parser()

    def _initialize_parser(self):
        fastp_args = self.parser.add_argument_group("Fastp Options")
        fastp_args.add_argument("-i", "--in1", required=True, help="read1 input file name")
        fastp_args.add_argument("-o", "--out1", required=True, help="read1 output file name")
        fastp_args.add_argument("-I", "--in2", help="read2 input file name")
        fastp_args.add_argument("-O", "--out2", help="read2 output file name")

    def parse_arguments(self):
        self.args = self.parser.parse_args(self.args)
        return self.args

main.py:

import argparse
from fastp_arguments import FastpArguments

def main():
    parser = argparse.ArgumentParser(description='My Tool', add_help=False)
    parser.add_argument('-h', '--help', action='help', help='Show this help message and exit')
    subparsers = parser.add_subparsers(dest='tool', help='Sub-command help')

    fastp_args_class = FastpArguments()
    fastp_parser = subparsers.add_parser('fastp', help='Fastp Help', parents=[fastp_args_class.parser], add_help=False)
    fastp_parser.add_argument('-h', '--help', action='help', help='Show this help message and exit')

    args = parser.parse_args()

    if args.tool == 'fastp':
        fastp_args_class.args = args
        fastp_args_class.parse_arguments()
        print("Fastp selected")
        print(fastp_args_class.args)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

问题 当我运行 seqsightqc fastp -h 时,出现以下错误:

argparse.ArgumentError: argument -h/--help: conflicting option strings: -h, --help

我尝试过的 为父解析器设置

add_help=False
。 手动将
-h/--help
参数添加到顶级解析器和子解析器。

期望的结果

我希望能够运行

seqsightqc fastp -h
并查看 fastp 子命令的帮助消息,而不会出现任何冲突或错误。

问题

在此设置中使用子命令时,如何解决

argparse
-h/--help
参数的冲突? 具体来说,我希望最后的
-h
打印所有模块的所有参数!

python argparse
1个回答
0
投票

在 ipython 会话中,我创建了您的类,以及来自

parser
main
对象。

基本帮助是:

In [14]: parser.parse_args(['-h'])
usage: ipykernel_launcher.py [-h] {fastp} ...

My Tool

positional arguments:
  {fastp}     Sub-command help
    fastp     Fastp Help

options:
  -h, --help  Show this help message and exit

还有

fastp
帮助:

In [15]: parser.parse_args(['fastp','-h'])
usage: ipykernel_launcher.py fastp -i IN1 -o OUT1 [-I IN2] [-O OUT2] [-h]

options:
  -h, --help            Show this help message and exit

Fastp Options:
  -i IN1, --in1 IN1     read1 input file name
  -o OUT1, --out1 OUT1  read1 output file name
  -I IN2, --in2 IN2     read2 input file name
  -O OUT2, --out2 OUT2  read2 output file name

这就是我所期望的。

如果我省略

add_Help=False
add_argument('-h', '--help'...
,我会得到同样的结果。

所以我不确定你的问题是什么。 只要

parent
FastpArguments
省略了
help
,就不应该出现这种冲突。 无论您是否使用
subparsers
,使用
parents
都需要至少一个
add_help=False

© www.soinside.com 2019 - 2024. All rights reserved.