ERLANG和PYTHON互通实现过程详解
最近开发Erlang,对其字符串处理能力无言至极,于是决定把它和python联合起来,打造一个强力的分布式系统,等将来需要系统级开发时,我再把C++/C组合进来.
首先参考了Erlang官方文档和http://blog.developers.api.sina.com.cn/?tag=erlang以及http://kazmier.net/computer/port-howto/.
研读了将近24个小时,才终于完全把问题解决.起名为town,town在英文里表示集市,也就是代表各种语言在这里的交流与互动。))
-module(town).
-behaviour(gen_server).
%%API
-export([start/0,combine/1]).
%%gen_servercallbacks
-export([init/1,handle_call/3,handle_cast/2,handle_info/2,
terminate/2,code_change/3]).
-record(state,{port}).
start()->
gen_server:start_link({global,?MODULE},?MODULE,[],[]).
stop()->
gen_server:cast(?SERVER,stop).
init([])->
process_flag(trap_exit,true),
Port=open_port({spawn,"python-u/home/freefis/Desktop/town.py"},[stream,{line,1024}]),
{ok,#state{port=Port}}.
handle_call({combine,String},_From,#state{port=Port}=State)->
port_command(Port,String),
receive
{Port,{data,{_Flag,Data}}}->
io:format("receiving:~p~n",[Data]),
sleep(2000),
{reply,Data,Port}
end.
handle_cast(stop,State)->
{stop,normal,State};
handle_cast(_Msg,State)->
{noreply,State}.
handle_info(Info,State)->
{noreply,State}.
terminate(_Reason,Port)->
ok.
code_change(_OldVsn,State,_Extra)->
{ok,State}.
%%--------------------------------------------------------------------
%%%Internal---------------------------------------------------------
combine(_String)->
start(),
String=list_to_binary("combine|"++_String++"\n"),
gen_server:call(?SERVER,{combine,String},infinity),
stop().
这段是Python的脚本当erlang中town:combine(“sentence1+sentence2”)执行时,会在后台启动python的脚本,处理完毕后返回给Erlang结果:sentence1sentence2,然后退出。
importsys
defhandle(_string):
if_string.startswith("combine|"):
string="".join(_string[8:].split(","))
returnstring
"""waitingforinput"""
while1:
#Recv.BinaryStreamasStandardIN
_stream=sys.stdin.readline()
ifnot_stream:break
#Scheme,TurnintoFormalString
inString=_stream.strip("\r\n")
#handleString
outString=handle(inString)
#sendtoportasStandartOUT
sys.stdout.write("%s\n"%(outString,))
sys.exit(0)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。