在argparse中,子解析器会继承父解析器的参数,而可选参数默认是在位置参数之后解析的。如果需要在子解析器中将可选参数放在位置参数之前进行解析,可以使用argparse.REMAINDER
来实现。
下面是一个示例代码:
import argparse
# 创建父解析器
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('input_file', help='输入文件')
parent_parser.add_argument('-v', '--verbose', action='store_true', help='详细信息')
# 创建子解析器
child_parser = argparse.ArgumentParser(parents=[parent_parser])
child_parser.add_argument('-o', '--output_file', help='输出文件')
child_parser.add_argument('args', nargs=argparse.REMAINDER)
# 解析命令行参数
args = child_parser.parse_args()
# 输出解析结果
print('输入文件:', args.input_file)
print('输出文件:', args.output_file)
print('详细信息:', args.verbose)
print('其他参数:', args.args)
在上面的代码中,父解析器parent_parser
定义了一个位置参数input_file
和一个可选参数--verbose
。子解析器child_parser
继承了父解析器的参数,并且额外定义了一个可选参数--output_file
和一个args
参数,args
参数使用argparse.REMAINDER
来接收剩余的命令行参数。
这样,可选参数--output_file
就可以在位置参数input_file
之前进行解析了。例如,可以通过以下命令行运行代码:
python script.py -o output.txt input.txt --verbose extra_arg1 extra_arg2
输出结果如下:
输入文件: input.txt
输出文件: output.txt
详细信息: True
其他参数: ['extra_arg1', 'extra_arg2']
可以看到,input.txt
被解析为位置参数input_file
,output.txt
被解析为可选参数--output_file
,--verbose
被解析为True
,extra_arg1
和extra_arg2
被解析为args
参数的值。