2011-08-23 68 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