在Jupyter Notebook中模拟argparse并正确解析参数的方法
解决Jupyter Notebook中argparse参数解析不符合预期的问题
我明白你遇到的问题了——你设置了sys.argv来模拟命令行参数,但argparse把--config-file当成了程序名,反而把my_config归到了位置参数opts里,导致config_file用了默认值。这是因为argparse默认会把sys.argv[0]当作程序本身的名称,不会把它当作参数解析。
问题根源
你当前设置的sys.argv = ['--config-file', "my_config"],在argparse眼里等价于:
程序名是
--config-file,后面跟着一个位置参数my_config
所以它会把config_file留空(用默认值),把my_config塞进opts这个剩余参数里。
两种可行的解决方法
方法1:给sys.argv添加一个假的程序名
只需要在参数列表最前面加一个无关的字符串(模拟脚本文件名),argparse就会正确解析后续的参数:
import sys import argparse # 添加假的程序名作为sys.argv的第一个元素 sys.argv = ['dummy_notebook.py', '--config-file', "my_config"] def argument_parser(): parser = argparse.ArgumentParser() parser.add_argument("--config-file", default="", help="path to config file") parser.add_argument( "opts", help="Modify config options", default=None, nargs=argparse.REMAINDER, ) return parser parser = argument_parser() args = parser.parse_args() print("Commandline Args:", args) # 输出:Commandline Args: Namespace(config_file='my_config', opts=[])
方法2:直接给parse_args传递参数列表(更推荐)
不需要修改全局的sys.argv,直接把要模拟的参数作为列表传给parse_args(),这种方式更干净,不会影响Jupyter环境里其他地方的sys.argv:
import argparse def argument_parser(): parser = argparse.ArgumentParser() parser.add_argument("--config-file", default="", help="path to config file") parser.add_argument( "opts", help="Modify config options", default=None, nargs=argparse.REMAINDER, ) return parser parser = argument_parser() # 直接传入要解析的参数列表,不用管sys.argv args = parser.parse_args(['--config-file', "my_config"]) print("Commandline Args:", args) # 输出:Commandline Args: Namespace(config_file='my_config', opts=[])
验证效果
两种方法都会得到你期望的核心结果:config_file被正确赋值为my_config(注:因为没有额外的位置参数,opts会是空列表,这是符合参数定义的正常现象)。
内容的提问来源于stack exchange,提问作者jss367
相关产品推荐
相关产品推荐

