2014-01-18 57 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