python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python-parser.parse_args()参数

python-parser.parse_args()解析参数问题

作者:北辰悠杏

这篇文章主要介绍了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()方法添加参数

其中,包含的参数类型有:

此外,也可以继承 argparse.Action 自定义参数解析;

使用 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)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文