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 相关文章推荐
Django框架中方法的访问和查找
Jul 15 Python
Python类的动态修改的实例方法
Mar 24 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
python实现证件照换底功能
Aug 20 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
Python socket服务常用操作代码实例
Jun 22 Python
python 实现两个npy档案合并
Jul 01 Python
Python 随机按键模拟2小时
Dec 30 Python
PyCharm常用配置和常用插件(小结)
Feb 06 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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整合PayPal支付
2015/06/11 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
Python实现读取Properties配置文件的方法
2018/03/29 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
《新型玻璃》教学反思
2014/04/13 职场文书
校园文化标语
2014/06/18 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
计划生育责任书
2015/05/09 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书