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的chardet库获得文件编码并修改编码
Jan 22 Python
python创建临时文件夹的方法
Jul 06 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python 通过打码平台实现验证码的实现
May 13 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
Python交互式图形编程的实现
Jul 25 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
使用python实现kNN分类算法
Oct 16 Python
Tensorflow限制CPU个数实例
Feb 06 Python
Django框架请求生命周期实现原理
Nov 13 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
2015/07/01 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
javascript编程起步(第一课)
2007/01/10 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
一些不错的js函数ajax
2008/08/20 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
javascript操作cookie
2017/01/17 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
Python读写Redis数据库操作示例
2014/03/18 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
Python之循环结构
2019/01/15 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
c++工程师面试问题
2013/08/04 面试题
会计自我鉴定范文
2013/10/06 职场文书
委托协议书范本
2014/04/22 职场文书
工作保证书范文
2014/04/29 职场文书