我正在写我的论文申请。我需要线性编程,但我的应用程序是用 Elixir 编写的,这实际上不是用于此类操作的语言。这就是为什么我决定使用 Erlport 作为 Elixir 依赖项,它能够将 Python 代码与 Elixir 连接起来。我还使用 Pulp 作为优化的 python 库。
Elixir 版本:1.10.4,Erlport 版本:0.10.1,Python 版本:3.8.5,PuLP 版本:2.3
我为 Elixir-Python 通信编写了这样一个模块,它利用 GenServer 作为 Elixir 和 Python 之间的主要“通信中心”:
defmodule MyApp.PythonHub do
use GenServer
def start_link(_) do
GenServer.start_link(__MODULE__, nil, name: __MODULE__)
end
def init(_opts) do
path = [:code.priv_dir(:feed), "python"]
|> Path.join() |> to_charlist()
{:ok, pid} = :python.start([{ :python_path, path }, { :python, 'python3' }])
{:ok, pid}
end
def handle_call({:call_function, module, function_name, arguments}, _sender, pid) do
result = :python.call(pid, module, function_name, arguments)
{:reply, result, pid}
end
def call_python_function(file_name, function_name, arguments) do
GenServer.call(__MODULE__, {:call_function, file_name, function_name, arguments}, 10_000)
end
end
对 GenServer 本身的调用如下所示:
PythonHub.call_python_function(:diets, python_function, [products_json, meal_statistics_json, @min_portion, @max_portion, @macro_enhancement])
其中python_function是:calculate_meal_4,products_json和meal_statistic_json是包含所需数据的 json。
通过python3 Diets.py调用calculate_meal_4时,它启动了上面的python脚本,并带有一些示例,但是真实的(取自应用程序),数据一切正常 - 我几乎很快就得到了最小化的结果。通过 Elixir Erlport 调用 python 脚本时出现问题。看看打印的输出,我可以看出它似乎一直有效,直到
solved_model = model.solve()
叫做。然后脚本似乎冻结了,GenServer 最终达到了GenServer.call函数的超时。
我还测试了一个简单的 python 测试文件的调用:
def pass_var(a):
print(a)
return [a, a, a]
效果很好。
这就是为什么我现在真的很困惑,我正在寻求任何建议。遗憾的是我还没有发现什么。
收到一只叮咚
相关分类