当前位置: 首页 > news >正文

【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}"

相关文章:

  • Box86源码剖析(一)
  • OMI(operating mode indication)
  • 从零开始跑通3DGS教程:(一)数据(采集)
  • 智能化OCR:揭开图片数据泄露的“隐形面纱”
  • 数据库——MySQL字符、日期函数
  • MySQL基础语法1
  • ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划|文献速递-医学影像人工智能进展
  • Kubernetes》》k8s》》Replication Controller
  • NoSQL 数据库深度解析与 20 款产品对比
  • pandas【2】DataFrame/Series
  • leetcode102 二叉树的层次遍历 递归
  • Multi-Stage Progressive Image Restoration论文阅读
  • JavaScript网页设计高级案例:构建交互式图片画廊
  • Java 8-17核心特性全景解析之Java11
  • suse15 sp1使用华为云软件源yum源zypper源
  • 树形结构溯源dp
  • DeepSeek 本地化部署教程
  • Hyperliquid 遇袭「拔网线」、Polymarket 遭治理攻击「不作为」,从双平台危机看去中心化治理的进化阵痛
  • 方阵幂次(矩阵快速幂)
  • 计算机等级考试数据库三级(笔记3)
  • 化妆品的网站建设/百度的总部在哪里
  • 高校两学一做专题网站/网络推广员要怎么做
  • 王野天 女演员/金阊seo网站优化软件
  • 开发国外优惠卷网站如何做/推广平台app
  • 中企动力建站怎么样/百度官方认证
  • 网站建设比较好/网页设计代码案例