• 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添加为可执行文件

  • 相关阅读:
    let,const及解构赋值
    开发规范
    深入理解javascript之this
    深入理解javascript之作用域
    深入理解javascript之数据存储
    深入理解javascript之定时器
    Android 多选列表对话框 setMultiChoiceItems
    Android 单选列表对话框 setSingleChoiceItems
    Android 列表对话框 setItems
    Android 警告对话框 AlertDialog
  • 原文地址:https://www.cnblogs.com/gibbon/p/Erlang.html
Copyright © 2020-2023  润新知