ERLANG和PYTHON互通实现过程详解


Posted in Python onJuly 05, 2019

最近开发 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_server callbacks
-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,然后退出。

import sys
def handle(_string):
 if _string.startswith("combine|"):
  string = "".join( _string[8:].split(","))
  return string
 
"""waiting for input """
while 1:
 # Recv. Binary Stream as Standard IN
 _stream = sys.stdin.readline()
 
if not _stream: break
 # Scheme, Turn into Formal String
 inString = _stream.strip("\r\n")
 # handle String
 outString = handle(inString)
 # send to port as Standart OUT
 sys.stdout.write("%s\n" % (outString,))
 sys.exit(0)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python连接MySQL数据库实例分析
May 12 Python
Python数据类型详解(二)列表
May 08 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
深入解析神经网络从原理到实现
Jul 26 Python
python yield关键词案例测试
Oct 15 Python
TensorFlow 显存使用机制详解
Feb 03 Python
Python新手如何进行闭包时绑定变量操作
May 29 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
用python批量下载apk
Dec 29 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 Python
Python实现自动玩连连看的脚本分享
Apr 04 Python
python如何读取bin文件并下发串口
Jul 05 #Python
anaconda如何查看并管理python环境
Jul 05 #Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 #Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 #Python
python调用并链接MATLAB脚本详解
Jul 05 #Python
python实现最大子序和(分治+动态规划)
Jul 05 #Python
Python实现最大子序和的方法示例
Jul 05 #Python
You might like
傻瓜化配置PHP环境――Appserv
2006/12/13 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
优化javascript的执行速度
2010/01/23 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
jQuery实现的分页插件完整示例
2020/05/26 jQuery
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
在Django的视图中使用form对象的方法
2015/07/18 Python
python ETL工具 pyetl
2020/06/07 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
2014年电话销售工作总结
2014/12/01 职场文书