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

--------------------------------------------------------分割线 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}"

--------------------------------------------------------分割线 2025.4.15-------------------------------------------------------

error:microsoft visual c++ 14.0 or greater is required
使用Cython对python代码进行加密,出现报错,需要C++依赖库
解决方法:根据提示的网站,下载相应的工具

https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/

在这里插入图片描述
下载过后,进行安装

在这里插入图片描述
在这里插入图片描述
安装完成即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

机器不学习我学习

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值