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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。