2011-08-23 30 views
2

让说我有二郎神“企业应用”:如何与Python代码中的Erlang代码进行通信?

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

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

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

    goodbye -> 
    ok 
end. 

有没有办法从Python代码运行呢?这样我就可以得到“你好,世界!”文本回到Python? Erlport似乎工作相反..

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

回答

6

你在找什么是Py-Interface,它在Python中实现了一个Erlang兼容的Node。

的py_interface提供来创建可以是用于与其它Erlang节点通信 一个节点的可能性。

如果您有写在二郎一个一次性的命令行程序,只是想执行它并捕获输出,只需使用subprocess模块就像你使用任何其他外国可执行文件。

+0

好的答案,你也可以添加扭曲的实现https://launchpad.net/twotp,如果你是这样的和协议的文档http://www.erlang.org/doc/apps/erts/erl_dist_protocol.html – Ale

+0

+1我将其标记为正确。虽然许可证很不适合我正在研究的项目.. – mkorpela

0

没有为厄兰一个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)) 
+0

-1正如我提到我想它以相反的方式工作。 – mkorpela

+0

这段代码是在你的python代码中运行erlang,我发布了一个链接到其他方式... – prince

+0

您的答案是从erlport页面复制粘贴。正如我在问题中提到的,我想从python代码开始。 – mkorpela

0

您可以使用subprocess模块来做到这一点。 这是使用该模块一个基本的例子:

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

的通信功能等待EOF,所以你不能真正实时的沟通,与你的应用进行互动。
此外,pexpect模块可以做同样的事情,并允许您与应用程序进行交互。

3

使用gen_tcp和套接字,卢克!

+0

或[0mq](http://zero.mq)可能更方便。 –

-1

如果您需要Erlang在Python中执行某些操作,那么您最好创建一个escript。然后脚本被你的python脚本调用。

 

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

这样,你做口编程,插座,这可能会引入开销保持:如果说你管他们这样的二郎escript会吐到你的Python脚本你想要的输出。一个简单的脚本可以做你想做的事情,让Python与Erlang很好地沟通。我现在已经使用escripts很长时间了,他们很好地使用Bash,perl和Lua脚本。

我们可以在bash上使用命令替换。 我们创建了一个erlang脚本或命令。命令的意思是这样的:

 
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脚本来获取和消费二郎神命令或escript outpu的输出这样

 
bash-3.2$ python python_script.py $h