Erlang port communicate with python

只保留核心代码, 看起来方便。

erlang代码

-module(port_test).
-export([start/0, send/1, stop/0]).


start() ->
    Fun = 
        fun() ->
            register(?MODULE, self()),
            Port = open_port({spawn, "./port_test.py"}, 
                             [{packet, 2}]),
            %% {packet, 2}
            loop(Port)
        end,
    spawn(Fun),
    ok.

send(Data) ->
    ?MODULE ! {send, self(), Data},
    receive
        {get, RData} ->
            RData
    end.

stop() ->
    ?MODULE ! {stop, self()},
    stop.

loop(Port) ->
    receive
        {send, From, Data} ->
            port_command(Port, Data),
            receive
                {Port, {data, RData}} ->
                    From ! {get, RData}
            after 2000 ->
                    From ! {get, timeout}
            end,
            loop(Port);
        {stop, _From} ->
            port_close(Port),
            stop;
        {'EXIT', Port, Reason} ->
            io:format("~p~n", [Reason]),
            stop
    end.

python代码

#!/usr/bin/python

import sys
from struct import pack, unpack

def log(logStr):
    f = open('log', 'a')
    f.write(logStr + '\n')
    f.close()
    pass

i = 0
while 1:
    try:
        dataLenStr = sys.stdin.read(2)
        if not dataLenStr: break
        (dataLen,) = unpack('>H', dataLenStr)
        log('data len str: %s' % str(dataLen))
        if dataLen:
            data = sys.stdin.read(dataLen)
            i += 1
            msg = '%s. received %s: %s' % (str(i), str(dataLen), data)
            sendData = ''.join([pack('>H', len(msg)), msg])
            sys.stdout.write(sendData)
            sys.stdout.flush()
            log(msg)

    except Exception, e:
        log(str(e))
        break

注意py文件一定要用chmod +x port_test.py添加为可执行文件

posted on 2012-12-26 00:38  盐味  阅读(332)  评论(0编辑  收藏  举报