我正在开发一个 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
打印所有模块的所有参数!
在 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
。