我想执行一些 erlang 命令,shell 可以通过一些命令启动:
/opt/myserver/bin/myserver remote_console
以上命令将启动一个 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()
,但效果不佳。
最佳答案
Erlang 不是一种脚本语言,它的设计目的不是为了被执行然后死掉。 Erlang 用于长期任务,在您的示例中,与 python 代码通信的更好方法是使用 Erlang 提供的所有通信工具。
您的方法会遇到的另一个问题是关于竞争条件和 Erlang 节点可能的无序输出。 Erlang 不保证所有进程的启动顺序。
在这种情况下,最好的方法是使用 Erlang 的互操作性工具。教程可从 Erlang Official Documentation 获得。 . C 节点、驱动程序和 NIF 是用 C 语言编写的,但您可以轻松地使用 Ports 来互连您的 python 脚本和您的 erlang 代码。
另一种可能性是使用本地 unix 套接字(自版本 20 起可用)并使用它与您的 python 脚本进行通信。
关于python - 如何使用python执行erlang命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48294028/