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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
Django继承自带user表并重写的例子
Nov 18 Python
Python 用turtle实现用正方形画圆的例子
Nov 21 Python
pymysql模块的操作实例
Dec 17 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
Python select及selectors模块概念用法详解
Jun 22 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
python 视频下载神器(you-get)的具体使用
Jan 06 Python
python爬虫scrapy基本使用超详细教程
Feb 20 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
星际争霸任务指南——神族
2020/03/04 星际争霸
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
php遍历CSV类实例
2015/04/14 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
php面向对象重点知识分享
2019/09/27 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
自我鉴定写作要点
2014/01/17 职场文书
校车安全责任书
2014/08/25 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
办护照工作证明
2014/10/01 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
MySQL 数据库范式化设计理论
2022/04/22 MySQL