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中操作列表之List.append()方法的使用
May 20 Python
Python中atexit模块的基本使用示例
Jul 08 Python
浅谈Python单向链表的实现
Dec 24 Python
Python实现随机选择元素功能
Sep 14 Python
Python实现基于POS算法的区块链
Aug 07 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
Apr 08 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
Python库安装速度过慢解决方案
Jul 14 Python
Python进行统计建模
Aug 10 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
Python实现制作销售数据可视化看板详解
Nov 27 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框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
python通过索引遍历列表的方法
2015/05/04 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
在python 中实现运行多条shell命令
2019/01/07 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
什么是封装
2013/03/26 面试题
如何写出好的Java代码
2014/04/25 面试题
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
驾驶员安全责任书
2014/07/22 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
春秋淹城导游词
2015/02/11 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android