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实现模拟登录及表单提交的方法
Jul 25 Python
python语言使用技巧分享
May 31 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
在windows下Python打印彩色字体的方法
May 15 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
python实现静态web服务器
Sep 03 Python
Python3将数据保存为txt文件的方法
Sep 12 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
python中__slots__节约内存的具体做法
Jul 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
类的另类用法--数据的封装
2006/10/09 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python和shell获取文本内容的方法
2018/06/05 Python
python之yield和Generator深入解析
2019/09/18 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
毕业生护理专业个人求职信范文
2014/01/04 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
人事任命通知书
2015/04/21 职场文书
小学生节水倡议书
2015/04/29 职场文书
老员工辞职信范文
2015/05/12 职场文书
离婚答辩状范文
2015/05/22 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书