如何使用python执行erlang命令

Posted

技术标签:

【中文标题】如何使用python执行erlang命令【英文标题】:how to execute erlang command using python 【发布时间】:2018-06-25 21:59:11 【问题描述】:

我想执行一些erlang命令,shell可以通过一些命令来启动:

/opt/myserver/bin/myserver 远程控制台

上面的命令将启动一个 shell,我可以在其中执行 erlang 命令。我想从我的 python 脚本中做同样的事情。

我尝试使用子进程来执行此操作,但这似乎不起作用。

import shlex
from subprocess import Popen, PIPE

cmd = '/opt/myserver/bin/myserver remote_console'
proc = Popen(shlex.split(cmd), stdin=PIPE, stdout=PIPE, stderr=STDOUT)
er_cmd = web_api_handler:process_rfid(30001,<<“RC“>>,arg).
out = proc.communicate(input=er_cmd)

上述方法执行 erlang 命令,但由于某种原因失败。但是,我可以在不使用 python 子进程的情况下启动 shell 时执行相同的命令。

我尝试使用proc.stdin.write(),然后也使用proc.communicate(),但效果不佳。

【问题讨论】:

“由于某种原因失败”。那是什么原因?你有错误信息吗? 【参考方案1】:

Erlang 不是一种脚本语言,它的设计初衷不是为了执行而死。 Erlang 是一项长期任务,在您的示例中,与您的 python 代码进行通信的更好方法是使用 Erlang 提供的所有通信工具。

您的方法会遇到的另一个问题是关于竞态条件以及可能来自 Erlang 节点的无序输出。 Erlang 不保证所有进程的启动顺序。

在这种情况下,最好的方法是使用 Erlang 的互操作性工具。可从Erlang Official Documentation 获得教程。 C 节点、驱动程序和 NIF 是用 C 编写的,但您可以轻松地使用端口来互连您的 python 脚本和您的 erlang 代码。

另一种可能性是使用本地 unix 套接字(自 20 版起可用)并使用它与您的 python 脚本进行通信。

【讨论】:

【参考方案2】:

我认为你需要Erlang Script。 但我不建议你这样做。我认为你应该按照 Mathieu Kerjouan 所说的去做。

如果你坚持按你说的做,请考虑以下解决方案:

    将您的 Erlang 应用程序作为守护程序启动。 使用 escript 通过 Erlang 的 rpc 与您的应用程序进行通信。 在您的 python 代码中控制 escript。

【讨论】:

以上是关于如何使用python执行erlang命令的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 erlang os:cmd()?

如何在 Erlang shell 中运行 Erlang 应用程序

Erlang 命令行

erlang如何使用一个OS线程实现抢占式调度?

Erlang的编程语言使用方法:

Erlang:如何在主管中正确调度带有 start_child 的 gen_server 并调用 API