在 Flask Web 服务器中使用 Pyomo 时如何解决错误?

Posted

技术标签:

【中文标题】在 Flask Web 服务器中使用 Pyomo 时如何解决错误?【英文标题】:How to solve error while using Pyomo in Flask web server? 【发布时间】:2019-12-22 10:49:17 【问题描述】:

我尝试使用 Flask 作为 web 框架,Pyomo 作为优化库,CBC 作为优化引擎来构建 web UI 来解决优化问题。当我在运行 Web 服务器时调用求解器时出现错误。

如果我只运行优化任务,我不会收到错误。使用 Flask Web 服务器时似乎会出现问题。

Flask调用此行solver = pyomo.SolverFactory('cbc', executable='CBC_PATH')时出现错误

运行网络服务器时出错:

  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyomo\opt\base\solvers.py", line 582, in solve
    _status = self._apply_solver()
  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyomo\opt\solver\shellcmd.py", line 244, in _apply_solver
    self._rc, self._log = self._execute_command(self._command)
  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyomo\opt\solver\shellcmd.py", line 308, in _execute_command
    define_signal_handlers = self._define_signal_handlers
  File "C:\Users\siwapolt\Envs\venv\lib\site-packages\pyutilib\subprocess\processmngr.py", line 545, in run_command
    = signal.signal(signal.SIGINT, handler)
  File "c:\users\siwapolt\appdata\local\continuum\anaconda3\Lib\signal.py", line 47, in signal
    handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread

【问题讨论】:

经过一番谷歌搜索,我发现这里提到了一个修复github.com/PyUtilib/pyutilib/issues/31#issuecomment-382479024。 【参考方案1】:

是的,只要你有 PyUtilib 5.6.3,你就有这个修复。也就是说,默认情况下,信号处理程序仍处于打开状态。如果你想关闭它,你需要:

import pyutilib.subprocess.GlobalData
pyutilib.subprocess.GlobalData.DEFINE_SIGNAL_HANDLERS_DEFAULT = False

参考:https://github.com/PyUtilib/pyutilib/issues/31#issuecomment-382479024

【讨论】:

你拯救了我的一天!

以上是关于在 Flask Web 服务器中使用 Pyomo 时如何解决错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用Flask在Ubuntu server 18.04中搭建web服务

如何在 Windows 机器上本地安装 CBC for Pyomo?

为啥我在使用 CPLEX 的 Pyomo 中出现不允许的字符错误?

PYOMO:如何创建约束松弛? (从 Pyomo 中的 CPLEX 重写约束)

如何在 Google Colab 中使用 Pyomo 解决抽象模型

如何在 pyomo 中使用集合和范围集的多级索引?