如何解决Python - Pyomo - R - Reticulate - [WinError 6] 句柄无效
“reticulate”包提供了从 R 调用 Python 的可能性。我尝试使用基于求解器“glpk”的 reticulate 和 pyomo 通过 R 运行以下代码。如果我独立于 R 执行代码,则 Python 代码正在工作。在 R 中使用包“reticulate”执行代码不起作用。我也在 stackoverflow (pyomo + reticulate error 6 the handle is invalid) 中发现了一个类似的问题,但无论是 setwd、以权限运行还是 setting.DEFINE_SIGNAL_HANDLERS_DEFAULT = False 都没有解决“错误 6 句柄无效”的问题。 预先感谢您的帮助!
溴, 亚历克斯
基于 Python 的示例来自:https://nbviewer.jupyter.org/github/Pyomo/PyomoGallery/blob/master/transport/transport.ipynb
Python 代码
from pyomo.environ import *
import pyutilib.subprocess.GlobalData
pyutilib.subprocess.GlobalData.DEFINE_SIGNAL_HANDLERS_DEFAULT = False
model = ConcreteModel()
model.i = Set(initialize=['seattle','san-diego'],doc='Canning plans')
model.j = Set(initialize=['new-york','chicago','topeka'],doc='Markets')
model.a = Param(model.i,initialize={'seattle':350,'san-diego':600},doc='Capacity of plant i in cases')
model.b = Param(model.j,initialize={'new-york':325,'chicago':300,'topeka':275},doc='Demand at market j in cases')
dtab = {
('seattle','new-york') : 2.5,('seattle','chicago') : 1.7,'topeka') : 1.8,('san-diego','chicago') : 1.8,'topeka') : 1.4,}
model.d = Param(model.i,model.j,initialize=dtab,doc='Distance in thousands of miles')
model.f = Param(initialize=90,doc='Freight in dollars per case per thousand miles')
def c_init(model,i,j):
return model.f * model.d[i,j] / 1000
model.c = Param(model.i,initialize=c_init,doc='Transport cost in thousands of dollar per case')
model.x = Var(model.i,bounds=(0.0,None),doc='Shipment quantities in case')
def supply_rule(model,i):
return sum(model.x[i,j] for j in model.j) <= model.a[i]
model.supply = Constraint(model.i,rule=supply_rule,doc='Observe supply limit at plant i')
def demand_rule(model,j):
return sum(model.x[i,j] for i in model.i) >= model.b[j]
model.demand = Constraint(model.j,rule=demand_rule,doc='Satisfy demand at market j')
def objective_rule(model):
return sum(model.c[i,j]*model.x[i,j] for i in model.i for j in model.j)
model.objective = Objective(rule=objective_rule,sense=minimize,doc='Define objective function')
def pyomo_postprocess(options=None,instance=None,results=None):
model.x.display()
if __name__ == '__main__':
# This emulates what the pyomo command-line tools does
from pyomo.opt import SolverFactory
import pyomo.environ
opt = SolverFactory("glpk")
results = opt.solve(model)
#sends results to stdout
results.write()
print("\nDisplaying Solution\n" + '-'*60)
pyomo_postprocess(None,model,results)
R 中的代码:
library("reticulate")
use_python("C:/Anaconda",required = TRUE)
setwd("C:/Users/mea39219/Documents/R/Test")
a <- py_run_file("transportproblem.py",local=T)
a$results
R 输出:
> library("reticulate")
> use_python("C:/Anaconda",required = TRUE)
> reticulate::py_config()
python: C:/Anaconda/python.exe
libpython: C:/Anaconda/python38.dll
pythonhome: C:/Anaconda
version: 3.8.8 (default,Apr 13 2021,15:08:03) [MSC v.1916 64 bit (AMD64)]
Architecture: 64bit
numpy: C:/Anaconda/Lib/site-packages/numpy
numpy_version: 1.20.1
NOTE: Python version was forced by use_python function
>
> setwd("C:/Users/mea39219/Documents/R/Test")
>
> a <- py_run_file("transportproblem.py",local=T)
Error in py_run_file_impl(file,local,convert) :
RuntimeError: Attempting to use an unavailable solver.
The SolverFactory was unable to create the solver "glpk"
and returned an UnknownSolver object. This error is raised at the point
where the UnknownSolver object was used as if it were valid (by calling
method "solve").
The original solver was created with the following parameters:
type: glpk
_args: ()
options: {}
WARNING: Failed to create solver with name 'glpk': Could not execute the
command: 'C:\Anaconda\Library\bin\glpsol.exe --version'
Error message: [WinError 6] Das Handle ist ungültig
> a$results
Error: object 'a' not found
版本:glpk (5.0)、pyomo (5.7.2)、网纹 (1.12)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。