只保留核心代码, 看起来方便。
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添加为可执行文件