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 02 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
理论讲解python多进程并发编程
Feb 09 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
Apr 21 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
Django框架视图函数设计示例
Jul 29 Python
Django model 中设置联合约束和联合索引的方法
Aug 06 Python
python打包成so文件过程解析
Sep 28 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 Python
Python通过len函数返回对象长度
Oct 22 Python
Python包argparse模块常用方法
Jun 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中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
Python实现的简单线性回归算法实例分析
2018/12/26 Python
python中的decimal类型转换实例详解
2019/06/26 Python
python求质数列表的例子
2019/11/24 Python
Python运行异常管理解决方案
2020/03/09 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
社会实践心得体会
2014/01/03 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
会议欢迎词范文
2015/01/27 职场文书
世界遗产导游词
2015/02/13 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL