ERLANG和PYTHON互通实现过程详解

最近开发 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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • CentOS 6.5源码安装Erlang教程

    Erlang目前已经是Fedora和Debian/Ubuntu软件仓库中的一部分. Erlang目前最新的版本是OTP 17.0.Erlang是一种编程语言,用于构建大规模.高可伸缩性.高可用性的软实时系统的编程语言.它已经在电信.金融.电子商务.网络电话和即时消息中得到应用.Erlang的运行时系统已经内建了对并发.分布式和容错的支持. OTP是Erlang库和设计原则的集合,提供了开发各种系统的中间件.它包含了自己的分布式数据库.面向其它编程语言的接口.调试和发布处理工具等. BEAM是Er

  • Erlang实现的一个Web服务器代码实例

    转贴一个简单的Web服务器: httpd.erl %% httpd.erl - MicroHttpd -module(httpd). -author("ninhenry@gmail.com"). -export([start/0,start/1,start/2,process/2]). -import(regexp,[split/2]). -define(defPort,8888). -define(docRoot,"public"). start() ->

  • python读取excel表格生成erlang数据

    为了将excel数据自动转换成所需要的erlang数据,听同事说使用python会很方便简单,就自学了两天python,写了一个比较粗糙的python脚本,不过能用,有什么优化的地方请指教 代码如下: #!/usr/bin/env python # -*- coding: UTF-8 -*- import sys from openpyxl.reader.excel import load_workbook import os import os.path def gen_data(filena

  • Erlang中的Record详解

    在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP.Ruby或Python中的关联数组(Ruby中的Hash)是不可能的 在Ruby中我可以这样做: 复制代码 代码如下: server_opts = {:port => 8080, :ip => '127.0.0.1', :max_connections => 10} 在Erlang的语法级别不支持这种表达 为了避免这种限制,Erlang虚拟机提供了一个伪数据类

  • Erlang初学:Erlang的一些特点和个人理解总结

    我对 Erlang 编程理念的理解:以分布式架构师的角度写代码. 函数式编程 Erlang 里面的函数是数学里面的函数:必须有返回值. 只要是函数必然有返回值,函数是一个过程,以英文的句号为函数结束符. 函数结束之前的表达式就是该函数的返回值. 所以这也是在 Erlang 里面的函数不会看到任何 return 语句的原因. C++ 等其他语言的函数和函数之前可以通过共享变量来实现消息传递. Erlang 里面的函数不可以,消息的传递通过函数的传入和传出. 也只是为什么 Erlang 号称天生之处

  • Go/Python/Erlang编程语言对比分析及示例代码

    本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉. Go的很多语言特性借鉴与它的三个祖先:C,Pascal和CSP.Go的语法.数据类型.控制流等继承于C,Go的包.面对对象等思想来源于Pascal分支,而Go最大的语言特色,基于管道通信的协程并发模型,则借鉴于CSP分支. Go/Python/Erlang语言特性对比 如<编程语言与范式>一文所说,不管语言如何层出不穷

  • ERLANG和PYTHON互通实现过程详解

    最近开发 Erlang ,对其字符串处理能力无言至极,于是决定把它和python联合起来,打造一个强力的分布式系统,等将来需要系统级开发时,我再把 C++/C组合进来. 首先参考了 Erlang 官方文档和 http://blog.developers.api.sina.com.cn/?tag=erlang 以及 http://kazmier.net/computer/port-howto/ . 研读了将近24个小时, 才终于完全把问题解决. 起名为town,town在英文里表示集市,也就是代表

  • python使用配置文件过程详解

    这篇文章主要介绍了python使用配置文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过配置文件将变量暴露给用户修改 标准库模块configparser,从而可在配置文件中使用标准格式. 必须使用[files].[colors]等标题将配置文件分成几部分(section).标题的名称可随便指定,但必须将它们用方括号括起. $ cat area.ini [numbers] pi: 3.1415926535893971 [messag

  • Python连接字符串过程详解

    这篇文章主要介绍了python连接字符串过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在python中,如果有多个字符串,想要连接在一起,或者说想要拼接在一起该如何操作,在此记录下. 1.通过 + 这个加号操作符,将字符串拼接在一起 >>> "First" + "Python" + "Lesson" 'FirstPythonLesson' >>> &

  • docker打包Python环境的过程详解

    docker打包Python环境过程,步骤如下所示: 1 导出pip list下面的依赖包 pip freeze > requirements.txt 把导出的requirements.txt放在docker_test目录里 docker_test为将要打包的代码源文件夹.此demo的docker_test文件夹下面应该有requirements.txt和app.py文件 2 编写Dockfile文件 在docker_test同目录下创建Dockfile文件,格式如下: # 基于的基础镜像 FR

  • python内存动态分配过程详解

    一.前言 大多数编译型语言,变量在使用前必须先声明,其中C语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前.其他语言,想C++和java,允许"随时随地"声明变量,比如,变量声明可以在代码块的中间,不过仍然必须在变量被使用前声明变量的名字和类型. 在Python中,无序此类显式变量声明语句,变量在第一次被赋值时自动声明.和其他大多数语言一样,变量只有被创建和赋值后才能被使用. # 变量未声明 >>> x Traceback (most recent c

  • python配置文件写入过程详解

    python配置文件有.conf,.ini,.txt等多种 python集成的 标准库的 ConfigParser 模块提供一套 API 来读取和操作配置文件 我的配置文件如下 [MOTOR] comnum = 3 baud = 19200 m1slowstep = 10 m1faststep = 100 m1origin = 5 m2slowstep = 10 m2faststep = 50 m2origin = 5 [CoarseAdjust] standardx = 0.000000 st

  • jupyter notebook 自定义python解释器的过程详解

    目录 jupyter notebook 自定义python解释器 设置自定义python解释器 解决吧 jupyter notebook 自定义python解释器 jupyter notebook 和虚拟环境的好处就不多废话了 jupyter notebook 网页版交互环境,类似于ipython,功能强大 虚拟环境坏了就坏了,大不了重新安装 如何让 jupyter notebook在python虚拟环境中运行呢 找到jupyter安装路径(已Linux系统为例,Windows系统步骤大致相同)

  • 基于python中pygame模块的Linux下安装过程(详解)

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查是否安装了pip 打开一个终端窗口,并执行如下命令: Python2.7中: zhuzhu@zhuzhu-K53SJ:~$ pip --version pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7) Python3.X中: z

  • python 利用pyttsx3文字转语音过程详解

    这篇文章主要介绍了python 利用pyttsx3文字转语音过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 # -*- coding: utf-8 -*- import pyttsx3 engine = pyttsx3.init() with open("all.txt",'r',encoding='utf-8') as f: while 1: line = f.readline() print(line, end = '')

  • 基于python实现雪花算法过程详解

    这篇文章主要介绍了基于python实现雪花算法过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Snowflake是Twitter提出来的一个算法,其目的是生成一个64bit的整数: 1bit:一般是符号位,不做处理 41bit:用来记录时间戳,这里可以记录69年,如果设置好起始时间比如今年是2018年,那么可以用到2089年,到时候怎么办?要是这个系统能用69年,我相信这个系统早都重构了好多次了. 10bit:10bit用来记录机器ID

随机推荐