使用Argparse解析训练参数时触发SystemExit 2错误,寻求技术支持
嘿,这个问题我之前在Jupyter里用argparse的时候也碰到过!先给你拆解下错误原因:
usage: ipykernel_launcher.py [-h] [--image_path IMAGE_PATH] [--use_pre_trained USE_PRE_TRAINED]
ipykernel_launcher.py: error: unrecognized arguments: -f /root/.local/share/jupyter/runtime/kernel-ff8e2476-e39b-4e40-b8f9-6b8113fe8f1f.json
这个-f参数是Jupyter内核自动添加的,用来指定它的运行时配置文件,但你的argparse脚本没处理这个参数,所以就触发了"未识别参数"的错误。下面给你几个实用的解决方案:
方案1:手动传入测试参数(适合Jupyter里调试)
直接给parse_args()方法手动指定要解析的参数列表,跳过系统自动传入的Jupyter参数:
parser = argparse.ArgumentParser(description='Explore pre-trained AlexNet') parser.add_argument('--image_path', type=str, help='Full path to the input image to load.') parser.add_argument('--use_pre_trained', type=bool, default=True, help='Load pre-trained weights?') # 空列表表示不解析任何命令行参数,用默认值 args = parser.parse_args(args=[]) # 如果要测试自定义参数,就把参数写进去 # args = parser.parse_args(args=['--image_path', '/your/image/path.jpg', '--use_pre_trained', 'False'])
方案2:兼容Jupyter和命令行运行(通用方案)
如果你的脚本既要在Jupyter里调试,又要能在命令行正常运行,可以过滤掉Jupyter自动添加的-f参数:
import sys import argparse parser = argparse.ArgumentParser(description='Explore pre-trained AlexNet') parser.add_argument('--image_path', type=str, help='Full path to the input image to load.') parser.add_argument('--use_pre_trained', type=bool, default=True, help='Load pre-trained weights?') # 移除Jupyter的-f参数 if '-f' in sys.argv: sys.argv.remove('-f') args = parser.parse_args()
额外提醒:argparse的bool类型坑
这里还要给你提个小细节:你用type=bool其实达不到预期效果!因为argparse会把所有传入的字符串参数转成bool,而任何非空字符串都会被解析成True——哪怕你传--use_pre_trained False,得到的还是True。
解决这个问题的话,建议自定义一个布尔值转换函数:
import argparse def str2bool(v): if isinstance(v, bool): return v # 支持多种常见的布尔输入格式 if v.lower() in ('yes', 'true', 't', 'y', '1'): return True elif v.lower() in ('no', 'false', 'f', 'n', '0'): return False else: raise argparse.ArgumentTypeError('Boolean value expected.') # 使用自定义的转换函数 parser = argparse.ArgumentParser(description='Explore pre-trained AlexNet') parser.add_argument('--image_path', type=str, help='Full path to the input image to load.') parser.add_argument('--use_pre_trained', type=str2bool, default=True, help='Load pre-trained weights?')
这样不管你传True/False,还是1/0,甚至y/n,都能正确解析成布尔值啦。
内容的提问来源于stack exchange,提问作者user15295803

