解决SystemExit: 2,args = parser.parse_args() 的问题,

本文针对Python中使用argparse模块时出现的SystemExit:2错误进行了详细的分析,并提供了四种可行的解决方案,帮助读者理解并解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错:

 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=[])

原因分析:

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=[])

解决方案三:

开头添加:

参考链接:

python - SystemExit: 2 error when calling parse_args() within ipython - Stack Overflow

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)

# test.py import torch import util_S import numpy as np import argparse from baseline_methods_S import test_error # from model import STPN # model.py is implicitly loaded via torch.load # --- 新增 MinMaxScaler 类 --- class MinMaxScaler: """一个简单的 MinMaxScaler 实现""" def __init__(self, min_val, max_val): self.min = min_val self.max = max_val def transform(self, data): return (data - self.min) / (self.max - self.min + 1e-8) def inverse_transform(self, data): return data * (self.max - self.min + 1e-8) + self.min parser = argparse.ArgumentParser() parser.add_argument('--device', type=str, default='cpu:0', help='') parser.add_argument('--data', type=str, default='China', help='data type') parser.add_argument("--train_val_ratio", nargs="+", default=[0.7, 0.1], help='train/val ratio', type=float) parser.add_argument('--in_len', type=int, default=36, help='input time series length') parser.add_argument('--out_len', type=int, default=12, help='output time series length') parser.add_argument('--period', type=int, default=36, help='periodic for temporal embedding') parser.add_argument('--period1', type=int, default=7, help='periodicity for a week') args = parser.parse_args() def main(): device = torch.device(args.device) adj, training_data, val_data, test_data, _, _, test_w = util_S.load_data(args.data, args.train_val_ratio) supports = [torch.tensor(i).to(device) for i in adj] # --- 修改点: 使用 MinMaxScaler --- # 使用训练集的统计量来初始化scaler data_max = training_data[~np.isnan(training_data)].max() data_min = training_data[~np.isnan(training_data)].min() scaler = MinMaxScaler(data_min, data_max) test_index = list(range(test_data.shape[1] - (args.in_len + args.out_len))) label = [] for i in range(len(test_index)): label.append( np.expand_dims(test_data[:, test_index[i] + args.in_len:test_index[i] + args.in_len + args.out_len, :], axis=0)) label = np.concatenate(label) model = torch.load("stpn_traffic_" + args.data + ".pth") model.to(device) outputs = [] model.eval() for i in range(len(test_index)): testx = np.expand_dims(test_data[:, test_index[i]: test_index[i] + args.in_len, :], axis=0) testx = scaler.transform(testx) # 标准化测试输入 testw = np.expand_dims(test_w[:, test_index[i]: test_index[i] + args.in_len], axis=0) testw = torch.LongTensor(testw).to(device) testx[np.isnan(testx)] = 0 base_time_idx = training_data.shape[1] + val_data.shape[1] + test_index[i] ti_add = (np.arange(base_time_idx, base_time_idx + args.in_len) // args.period % args.period1) / args.period1 testti = (np.arange(base_time_idx, base_time_idx + args.in_len) % args.period) * np.ones([1, args.in_len]) / ( args.period - 1) + ti_add to_add = (np.arange(base_time_idx + args.in_len, base_time_idx + args.in_len + args.out_len) // args.period % args.period1) / args.period1 testto = (np.arange(base_time_idx + args.in_len, base_time_idx + args.in_len + args.out_len) % args.period) * np.ones([1, args.out_len]) / ( args.period - 1) + to_add testx = torch.Tensor(testx).to(device).permute(0, 3, 1, 2) testti = torch.Tensor(testti).to(device) testto = torch.Tensor(testto).to(device) output = model(testx, testti, supports, testto, testw) output = output.permute(0, 2, 3, 1) output = output.detach().cpu().numpy() output = scaler.inverse_transform(output) # 反归一化 outputs.append(output) yhat = np.concatenate(outputs) # --- 修改点: 评估前四舍五入并更新日志 --- yhat_rounded = np.round(yhat) print("\n--- Test Results for Flight Traffic Prediction ---") log_template = '{prefix}, Test MAE: {mae:.2f} flights, Test R2: {r2:.4f}, Test RMSE: {rmse:.2f} flights' # 评估抵达流量 (channel 0) mae, rmse, r2 = test_error(yhat_rounded[:, :, 2, 0], label[:, :, 2, 0]) print(log_template.format(prefix=' 3 step ahead arrival traffic ', mae=mae, r2=r2, rmse=rmse)) mae, rmse, r2 = test_error(yhat_rounded[:, :, 5, 0], label[:, :, 5, 0]) print(log_template.format(prefix=' 6 step ahead arrival traffic ', mae=mae, r2=r2, rmse=rmse)) mae, rmse, r2 = test_error(yhat_rounded[:, :, 11, 0], label[:, :, 11, 0]) print(log_template.format(prefix='12 step ahead arrival traffic ', mae=mae, r2=r2, rmse=rmse)) print("-" * 50) # 评估起飞流量 (channel 1) mae, rmse, r2 = test_error(yhat_rounded[:, :, 2, 1], label[:, :, 2, 1]) print(log_template.format(prefix=' 3 step ahead departure traffic', mae=mae, r2=r2, rmse=rmse)) mae, rmse, r2 = test_error(yhat_rounded[:, :, 5, 1], label[:, :, 5, 1]) print(log_template.format(prefix=' 6 step ahead departure traffic', mae=mae, r2=r2, rmse=rmse)) mae, rmse, r2 = test_error(yhat_rounded[:, :, 11, 1], label[:, :, 11, 1]) print(log_template.format(prefix='12 step ahead departure traffic', mae=mae, r2=r2, rmse=rmse)) if __name__ == "__main__": main() 以上错误是这个代码的运行结果,此外我还有两个util_S.py和model.py,我要这怎么修改才能完整运行
最新发布
07-18
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汀、人工智能

十分感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值