【Bug】记录2025年遇到的Bug以及修复方案

发布于:2025-03-30 ⋅ 阅读:(28) ⋅ 点赞:(0)

--------------------------------------------------------分割线 2025.3.25-------------------------------------------------------windows环境下通过命令行终端(必须是命令行下,直接赋值传递,代码正常)的形式传递字符串时,被转义,linux系统下就不存在这种情况

例如在windows系统环境下,执行下面的命令:

python test.py --model_params "{"n_estimators":200,"max_depth":12,"criterion":"mse","n_jobs":None,"random_state":10,"warm_start":False}"

在这里插入图片描述

变量的引号、值的引号都不见了,消失了!这导致算法参数赋值出现报错。找了很长时间这个问题到底是什么情况,如何避免,发生linux系统终端执行就不存在这个情况,得出的结论是和系统有关。(windows下使用不同的python版本也同样报错)

解决办法:
编写一个函数,对从终端获取的参数进行重写,变成符合要求的形式。当然这也结合了大模型给出的代码。

函数代码如下:

def convert_value(a):
    if a == 'True':
        return True
    elif a == 'False':
        return False
    elif a == 'None':
        return None
    # 尝试转换为整数
    try:
        int_val = int(a)
        if str(int_val) == a:
            return int_val
    except ValueError:
        pass
    # 尝试转换为浮点数
    try:
        float_val = float(a)
        if str(float_val) == a:
            return float_val
    except ValueError:
        pass
    # 其他情况返回原字符串
    return a


def convert_dict(s):
    # s = {A:a, B: b}, 转成字典
    # print("第一个s:", s)
    s = s.strip('{}')
    # print("strip后的s:", s)
    # 分割键值对
    pairs = [pair.strip() for pair in s.split(',')]
    print("pairs:", pairs)
    # 转换为字典
    result = {}
    for pair in pairs:
        key, value = pair.split(':')
        print(key, value)
        result[key.strip()] = convert_value(value.strip())

    return result

然后再在终端执行命令,一切正常:

在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 26 19:48:50 2025

@author: AIexplore
"""

import argparse
import json
from sklearn.ensemble import RandomForestRegressor


def convert_value(a):
    if a == 'True':
        return True
    elif a == 'False':
        return False
    elif a == 'None':
        return None
    # 尝试转换为整数
    try:
        int_val = int(a)
        if str(int_val) == a:
            return int_val
    except ValueError:
        pass
    # 尝试转换为浮点数
    try:
        float_val = float(a)
        if str(float_val) == a:
            return float_val
    except ValueError:
        pass
    # 其他情况返回原字符串
    return a


def convert_dict(s):
    # s = {A:a, B: b}, 转成字典
    # print("第一个s:", s)
    s = s.strip('{}')
    # print("strip后的s:", s)
    # 分割键值对
    pairs = [pair.strip() for pair in s.split(',')]
    print("pairs:", pairs)
    # 转换为字典
    result = {}
    for pair in pairs:
        key, value = pair.split(':')
        print(key, value)
        result[key.strip()] = convert_value(value.strip())

    return result


def model_train(params):
    print("最终参数:", params)
    model = RandomForestRegressor(**params)
    print("model:", model)


if __name__ == "__main__":
    arg_parser = argparse.ArgumentParser("launcher")
    arg_parser.add_argument('--model_params', type=str, help="模型的输入参数", default='{}')
    args = arg_parser.parse_args()
    
    # 获取参数
    params = args.model_params
    print("命令行获取参数:", params)
    
    # windows环境下转换
    params = convert_dict(params)
    print("转换获取参数:", params)

    # json
    # params = json.loads(params)
    # print("命令行获取参数:", params)

    model_train(params)
    
    # 必须使用双引号, 单引号报错
    # python test.py --model_params "{"n_estimators":200,"max_depth":12,"criterion":"mse","n_jobs":None,"random_state":10,"warm_start":False}"