python-parser.parse_args()解析参数问题
作者:北辰悠杏
python-parser.parse_args()解析参数
import argparse #设置参数对象,简要设置为该程序要执行什么任务 parser = argparse.ArgumentParser("mission_name") #调用 add_argument() 方法添加参数 parser.add_argument('--ckpt', type=str, default="./weigths/jaad/best.pth", help="Path to model weigths") #使用 parse_args() 解析添加的参数 args = parser.parse_args()
使用argparse的第一步
是创建一个 ArgumentParser 对象:
对 ArgumentParser 构造方法的调用都会使用 description= 关键字参数(可以忽略description= 只传递关键字参数.
调用add_argument()方法添加参数
其中,包含的参数类型有:
name or flags
- 选项字符串的名字或者列表,例如 foo 或者 -f, --foo.action
- 命令行遇到参数时的动作,默认值是 store.store_const
-表示赋值为const;append
-将遇到的值存储成列表,也就是如果参数重复则会保存多个值;append_const
-将参数规范中定义的一个值保存到一个列表;count
-存储遇到的次数.
此外,也可以继承 argparse.Action 自定义参数解析;
nargs
- 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const; 或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数.const
- action 和 nargs 所需要的常量值.default
- 不指定参数时的默认值.type
- 命令行参数应该被转换成的类型.choices
- 参数可允许的值的一个容器.required
- 可选参数是否可以省略 (仅针对可选参数).help
- 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.metavar
- 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.dest
- 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.
使用 parse_args() 解析添加的参数
ArgumentParser 通过 parse_args() 方法解析参数.它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作
解决SystemExit: 2,args = parser.parse_args()问题
报错
File "/home/barry/PycharmProjects/EEPC/detect.py", line 283, in parse_opt
opt = parser.parse_args()
File "/home/barry/anaconda3/envs/EEPC/lib/python3.9/argparse.py", line 1823, in parse_args
self.error(msg % ' '.join(argv))
File "/home/barry/anaconda3/envs/EEPC/lib/python3.9/argparse.py", line 2577, in error
self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
File "/home/barry/anaconda3/envs/EEPC/lib/python3.9/argparse.py", line 2564, in exit
_sys.exit(status)
SystemExit: 2
原因
报错原因:
argparse 是一个旨在解析从命令行传递的参数的模块,您可以使用 argparse 来编译 参数内容。
如果 argparse 认为参数无效,则退出,这通常在 python 中通过调用 sys.exit() 来完成,这会引发 SystemExit 错误,这就是您所看到的。
所以问题是你试图从交互式解释器(看起来像 ipython)中使用 argparse,此时程序已经启动,所以应该已经解析了 args。
解决方法一
args = parser.parse_args() 改成 args = parser.parse_args(args=[])
原因分析:
1.args = parser.parse_args()
2.parse_args(args=["-n3","-b2"])#表示给n参数赋值为3,b参数赋值为2。其他参数默认。 parse_args(args=[])#表示所有参数使用默认。
而我们的报错情况是形式1,一旦执行parse_args()
语句,python系统就会执行读取参数的操作(我们看不到),此时jupyter notebook系统默认会给一个奇怪的参数:
因此:
将parse_args()由形式1换成形式2。
最后一行换成:
import argparse parser = argparse.ArgumentParser(description="Deep Gaussian Processes on MNIST") parser.add_argument("-n", "--num-epochs", default=5, type=int) parser.add_argument("-t", "--num-iters", default=60, type=int) parser.add_argument("-b", "--batch-size", default=1000, type=int) parser.add_argument("-lr", "--learning-rate", default=0.01, type=float) args = parser.parse_args(args=[])
解决方案二
删除参数required=True,如果还不行的话按照再按照方法一方法添加
parser.add_argument("--model_path", type=str, required=True, default='/mnt/data_1/', help="The path to model parameters to be loaded.") parser.add_argument("--model_path", type=str, default='/mnt/data_1/', help="The path to model parameters to be loaded.")
args = parser.parse_args(args=[])
解决方案三
开头添加:
import sys sys.argv=[''] del sys
解决方法四
添加一个接受上面那个参数的语句。
parser.add_argument('-f', type=str, default="读取额外的参数")
import argparse parser = argparse.ArgumentParser(description="Deep Gaussian Processes on MNIST") parser.add_argument("-n", "--num-epochs", default=5, type=int) parser.add_argument("-t", "--num-iters", default=60, type=int) parser.add_argument("-b", "--batch-size", default=1000, type=int) parser.add_argument("-lr", "--learning-rate", default=0.01, type=float) parser.add_argument("-f","--file",default="file")#接收这个-f参数 args = parser.parse_args() print(args.file)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。