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处理文件目录的相关方法
Oct 16 Python
Python实现的质因式分解算法示例
May 03 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
python读取目录下最新的文件夹方法
Dec 24 Python
Python如何调用外部系统命令
Aug 07 Python
Python中IP地址处理IPy模块的方法
Aug 16 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 Python
python 串行执行和并行执行实例
Apr 30 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
python中如何写类
Jun 29 Python
Python OpenCV快速入门教程
Apr 17 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
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
pygame实现弹球游戏
2020/04/14 Python
python绘制分布折线图的示例
2020/09/24 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
美国在线工具商店:Acme Tools
2018/06/26 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
开工仪式策划方案
2014/05/23 职场文书
政府法律服务方案
2014/06/14 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
大学运动会加油稿
2015/07/22 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
2016年记者节感言
2015/12/08 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
python playwright 自动等待和断言详解
2021/11/27 Python
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
浅析Python OpenCV三种滤镜效果
2022/04/11 Python
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers