如何使用Python代码与Erlang代码进行通信?

时间:2011-08-23 11:24:59

标签: python erlang

假设我有Erlang“企业应用程序”:

-module(hello).
-export([start/0]).

start() ->
  spawn(fun() -> loop() end).

loop() ->
 receive
   hello ->
     io:format("Hello, World!~n"),
     loop();

   goodbye ->
     ok
 end.

有没有办法从Python代码运行它?这样我就可以得到“Hello,World!”文字回到Python? Erlport似乎在反过来工作..

编辑:换句话说,如何从Python绑定到Erlang端口?

5 个答案:

答案 0 :(得分:6)

您正在寻找的是Py-Interface,它在Python中实现了一个与Erlang兼容的节点。

  

py_interface提供了创建可能的节点的可能性   用于与其他Erlang节点通信。

如果你有一个用Erlang编写的一次性命令行程序,只想执行它并捕获输出,就像使用任何其他外部可执行文件一样使用subprocess模块。

答案 1 :(得分:3)

使用gen_tcp和套接字,Luke!

答案 2 :(得分:0)

有一个erland的python库,导入这个;-) http://erlport.org/

你好例子:

from erlport import Port, Protocol, String


# Inherit custom protocol from erlport.Protocol
    class HelloProtocol(Protocol):

# Function handle_NAME will be called for incoming tuple {NAME, ...}
    def handle_hello(self, name):
    # String wrapper forces name to be a string instead of a list
    return "Hello, %s" % String(name)


if __name__ == "__main__":
    proto = HelloProtocol()
    # Run protocol with port open on STDIO
    proto.run(Port(use_stdio=True))

答案 3 :(得分:0)

您可以使用subprocess模块执行此操作。 这是使用该模块的基本示例:

output = Popen(["ls", "-L"], stdout=PIPE).communicate()[0]

沟通功能等待EOF,因此您无法实时与您的应用进行实时通信。
此外,pexpect模块也可以执行相同操作,并允许您与应用程序进行交互。

答案 4 :(得分:-1)

如果您需要Erlang在Python中执行某些操作,最好创建一个 escript 。然后由您的python脚本调用escript。 Erlang escript会将你想要的输出吐出你的python脚本,如果你把它们像这样管道输出:


bash-3.2$ escript Your_Erlang_script.escript | python_script.py

通过这种方式,您可以避免执行端口编程,套接字,这可能会引入开销。一个简单的escript可以做你想要的,并让python与Erlang进行很好的通信。我很久以前就使用过escripts,他们很好地使用了Bash,perl和Lua脚本。

OR

我们可以在bash上使用命令替换。 我们创建一个erlang escript或命令。命令含义如下:

erl -noshell -eval "yourModule:someFunction()" -eval "erlang:halt()"
e.g.
bash-3.2$ h=`erl -noshell -eval "io:format(\"Hello world\",[])" -eval "erlang:halt()"`
bash-3.2$ echo $h
Hello World
bash-3.2$
现在通过创建如上所述的命令替换,我们将调用python脚本来获取和使用erlang命令或escript outpu的输出,如下所示

bash-3.2$ python python_script.py $h