Python 从pyomo';s SolveryFactory带cplex解算器

Python 从pyomo';s SolveryFactory带cplex解算器,python,cplex,pyomo,Python,Cplex,Pyomo,我正在使用pyomo5.7.3和cplex12.9 我正在从pyomo的SolverFactory调用solve方法,并使用下面的代码(工作正常)记录到文件'model.log' 但如果我将日志文件更改为”./runs/cplex.log',则会引发错误: ValueError:在CPLEX日志文件路径/名称中找到不允许的字符(/)。 出于可移植性的原因,仅允许[a-zA-Z0-9~:.-307;] 是否有一种方法可以在不引发错误的情况下将文件夹“/runs”的路径解析到日志文件参数中 此外,是

我正在使用pyomo5.7.3和cplex12.9

我正在从pyomo的SolverFactory调用solve方法,并使用下面的代码(工作正常)记录到文件
'model.log'

但如果我将日志文件更改为
”./runs/cplex.log'
,则会引发错误:

ValueError:在CPLEX日志文件路径/名称中找到不允许的字符(/)。 出于可移植性的原因,仅允许[a-zA-Z0-9~:.-307;]

是否有一种方法可以在不引发错误的情况下将文件夹“/runs”的路径解析到日志文件参数中

此外,是否可以使用日志记录包中的记录器并将cplex日志输出到此记录器

谢谢,


编辑:以一种简单的方式解决(代码如下)。有更好的办法吗

initial_dir = os.getcwd()

os.chdir(run_dir) #changing to log dir in order to avoid providing unallowed characters to lgofile argument in solve method

results = optimizer.solve(
    model,
    warmstart = True,
    tee = True,
    logfile = f'{model_name}_cplex_log.log',
    )

os.chdir(initial_dir) # returning to former directory

由于您使用的是pyomo 5.7.3,因此应该:

import os
log_folder = os.path.join(".","runs")
from pyomo.common.tempfiles import TempfileManager
TempfileManager.tempdir = log_folder
如果文件夹不存在,不要忘记创建它

PS:我在Pyomo中为solver函数编写了一个小包装器,它会自动完成这项工作,如果您愿意,还可以在解算之后对所有变量进行后期处理,尽管日志文件夹在我的示例中命名为“_log”,但日志文件根据模型名称按文件夹分组,然后按日期和时间命名

import os
log_folder = os.path.join(".","runs")
from pyomo.common.tempfiles import TempfileManager
TempfileManager.tempdir = log_folder