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