2014-01-18 101 views
0

我想從Python中的某個端口讀取一些數據。從Erlang運行python程序

然後我想從Erlang的函數調用中獲取Python中的數據。

因此,在技術上,雖然真正的一些全局變量將被設置,並根據erlang的請求,這些變量將被返回。

我正在使用erlport進行此通信,但是我發現我可以調用並轉換爲python代碼,但不能在python中運行函數(在本例中爲main)並讓它運行。當我嘗試使用調用函數erlang運行它時不起作用,顯然正在等待響應。

我該怎麼做? 如果您認爲這不是正確的方法,任何其他替代方法也很好。

+0

隨着「讀從端口的一些數據:」你的意思是從外部設備或二郎口唸嗎?爲什麼你需要首先在Python中聚合數據? – hdima

+0

是的,我們必須讀取數據的代碼是在Python中,我們不能改變它,因爲是一個更大的圖片的一部分,我們沒有控制 – Khashayar

回答

2

如果我正確地理解了這個問題,您希望從Python的外部端口接收一些數據,請將其聚合,然後將其傳輸到Erlang。

在情況下,如果你可以用你的Python代碼線程你也許可以做到這一點通過以下方式:

  • 運行外部端口接收循環中的一個線索
  • 一旦數據彙總推它作爲一個消息去Erlang。 (可惜你不能目前使用的線程和Python和ErlPort叫二郎功能)

下面是一個例子Python模塊與ErlPort工作:

from time import sleep 
from threading import Thread 

from erlport.erlterms import Atom 
from erlport import erlang 

def start(receiver): 
    Thread(target=receive_loop, args=[receiver]).start() 
    return Atom("ok") 

def receive_loop(receiver): 
    while True: 
     data = "" 
     for chunk in ["Got ", "BIG ", "Data"]: 
      data += chunk 
      sleep(2) 
     erlang.cast(receiver, [data]) 

for環代表了一些數據彙總程序。

而且在二郎殼它的工作原理是這樣的:

1> {ok, P} = python:start(). 
{ok,<0.34.0>} 
2> python:call(P, external_port, start, [self()]). 
ok 
3> timer:sleep(6). 
ok 
4> flush(). 
Shell got [<<"Got BIG Data">>] 
ok 
0

端口通過標準輸入/輸出與Erlang VM進行通信。你的python程序是否將stdin/stdout用於其他目的?如果是 - 可能是問題的原因。

+0

不,不是這樣的情況 – Khashayar