如何修复Python argparse中未识别的非必填参数问题?
argparse参数解析错误排查与修复
问题重现
原始代码
import argparse parser = argparse.ArgumentParser( prog='mix.py', description='Mixing to generative models', epilog="Example: python mix.py -a path/to/model_A.pth -b path/to/model_B.pth -w 0.3 -o my_mixed_model.pth will create a generator file my_mixed_model.pth which will mix voice A and B. w=0 --> 100 % A w=1 --> 100 % B") parser.add_argument('-a',metavar='',type=str, help='path to model A (ex. path/to/modelA/G_60000.pth)') # path to voice A G_*****.pth parser.add_argument('-b',metavar='',type=str, help='path to model B (ex. path/to/modelB/G_67000.pth)') # path to voice B G_*****.pth parser.add_argument('-w',metavar='', type=float, help='(float) relative weight: 0.0==voice_A, 1.0==voice_B') parser.add_argument('o',metavar='', type=str, help='output model (ex. out.pth)' ) # path to output mixed model args=parser.parse_args()
第一次报错
usage: mix.py [-h] [-a] [-b] [-w] mix.py: error: unrecognized arguments: -f An exception has occurred, use %tb to see the full traceback. SystemExit: 2
添加-f后的代码
import argparse parser = argparse.ArgumentParser( prog='mix.py', description='Mixing to generative models', epilog="Example: python mix.py -a path/to/model_A.pth -b path/to/model_B.pth -w 0.3 -o my_mixed_model.pth")# will create a generator file my_mixed_model.pth which will mix voice A and B. w=0 --> 100 % A w=1 --> 100 % B parser.add_argument('-a',metavar='',type=str, help='path to model A (ex. path/to/modelA/G_60000.pth)') # path to voice A G_*****.pth parser.add_argument('-b',metavar='',type=str, help='path to model B (ex. path/to/modelB/G_67000.pth)') # path to voice B G_*****.pth parser.add_argument('-w',metavar='', type=float, help='(float) relative weight: 0.0==voice_A, 1.0==voice_B') parser.add_argument("-f", required=False) parser.add_argument('o',metavar='', type=str, help='output model (ex. out.pth)' ) # path to output mixed model args=parser.parse_args()
第二次报错
usage: mix.py [-h] [-a] [-b] [-w] [-f F] mix.py: error: the following arguments are required: An exception has occurred, use %tb to see the full traceback. SystemExit: 2
用户调用脚本的命令
python mix.py -a SP_A/logs/44k/G_64000.pth -b SP_B/logs/44k/G_60000.pth -w 0.5 out.pth svc infer -n 1 -a -fm crepe -m out.pth -c SP_A/configs/44k/config.json input.wav -o output_50.wav
错误原因分析
-f参数来源:你没有手动传递-f,但报错中出现该参数,是因为你在Jupyter Notebook/Colab这类交互式环境中运行脚本时,环境会自动添加-f参数(用于传递内核配置文件),导致argparse识别到未定义的参数。- 必填参数缺失:你把输出路径
o定义成了位置参数(没有-o前缀),但在示例说明里写的是-o选项,导致调用逻辑混乱。添加-f参数后,位置参数的解析顺序被打乱,argparse无法正确识别你传入的out.pth,因此提示必填参数缺失。
修复方案
方案一:适配交互式环境,忽略未知参数
如果需要在Jupyter/Colab中运行,用parse_known_args()代替parse_args(),自动忽略环境添加的未知参数:
import argparse parser = argparse.ArgumentParser( prog='mix.py', description='Mixing to generative models', epilog="Example: python mix.py -a path/to/model_A.pth -b path/to/model_B.pth -w 0.3 -o my_mixed_model.pth will create a generator file my_mixed_model.pth which will mix voice A and B. w=0 --> 100 % A w=1 --> 100 % B") parser.add_argument('-a',metavar='PATH',type=str, required=True, help='path to model A (ex. path/to/modelA/G_60000.pth)') parser.add_argument('-b',metavar='PATH',type=str, required=True, help='path to model B (ex. path/to/modelB/G_67000.pth)') parser.add_argument('-w',metavar='WEIGHT', type=float, required=True, help='(float) relative weight: 0.0==voice_A, 1.0==voice_B') # 将输出参数改为可选参数,和示例保持一致 parser.add_argument('-o',metavar='PATH', type=str, required=True, help='output model (ex. out.pth)' ) # 忽略未知参数,适配Jupyter环境 args, unknown = parser.parse_known_args()
方案二:纯命令行环境,规范参数定义
如果只在普通命令行运行,把输出参数改为-o选项(和示例一致),保留parse_args():
import argparse parser = argparse.ArgumentParser( prog='mix.py', description='Mixing to generative models', epilog="Example: python mix.py -a path/to/model_A.pth -b path/to/model_B.pth -w 0.3 -o my_mixed_model.pth will create a generator file my_mixed_model.pth which will mix voice A and B. w=0 --> 100 % A w=1 --> 100 % B") parser.add_argument('-a',metavar='PATH',type=str, required=True, help='path to model A (ex. path/to/modelA/G_60000.pth)') parser.add_argument('-b',metavar='PATH',type=str, required=True, help='path to model B (ex. path/to/modelB/G_67000.pth)') parser.add_argument('-w',metavar='WEIGHT', type=float, required=True, help='(float) relative weight: 0.0==voice_A, 1.0==voice_B') parser.add_argument('-o',metavar='PATH', type=str, required=True, help='output model (ex. out.pth)' ) args = parser.parse_args()
注意事项
- 给
add_argument添加required=True明确必填参数,避免模糊性 metavar设置有意义的名称(比如PATH、WEIGHT),帮助信息会更清晰- 调用命令需和示例匹配,加上
-o前缀:python mix.py -a SP_A/logs/44k/G_64000.pth -b SP_B/logs/44k/G_60000.pth -w 0.5 -o out.pth
内容的提问来源于stack exchange,提问作者sos.cott
相关产品推荐
相关产品推荐

