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随手笔记之标准类型内建函数
Dec 02 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
详解supervisor使用教程
Nov 21 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 Python
Python实现的北京积分落户数据分析示例
Mar 27 Python
keras模型保存为tensorflow的二进制模型方式
May 25 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
优秀求职信
2014/05/29 职场文书
工程安全生产协议书
2014/11/21 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers