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下的Mysql模块MySQLdb安装详解
Apr 09 Python
Python实现的几个常用排序算法实例
Jun 16 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
Python格式化输出%s和%d
May 07 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
Mar 11 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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
php链表用法实例分析
2015/07/09 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
jQuery实现tab栏切换效果
2020/12/22 jQuery
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
医院节能减排方案
2014/06/13 职场文书
激励口号大全
2014/06/17 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
公务员个人考察材料
2014/12/23 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android
Redis入门基础常用操作命令整理
2022/06/01 Redis