总结:Python学习 和 Python与C/C++交互
本篇仅仅是Python的学习和Python和C++数据对接过程中的一些总结。
由于工作的需要,用一周的时间学习 Python。
Python是基于C实现的一门解释型语言,由于其易用性,俘获了不少开发者和运维的心。据说,Python 在科学计算领域,逐步吞噬着古老语言 Fortran的份额。这门语言是Google的第二语言,国内的知乎,豆瓣,都使用纯Python开发。Python的官方网站:http://www/python.org.
为了逐步完善的我们服务,我们需要为客户提供更多,更好,更安全便捷的服务。在已有服务基础上,为了满足某些互联网客户的需要,我们需要提供公司产品的Python驱动。
因为客户需求的紧迫性,和我们的优势,在进行一个周的数据对接调研和测试之后,我和我的搭档决定使用已经稳定的C++驱动,用Python写一个表现层,底层通过wrapper和C++接口进行对接,然后通过C++与数据库服务交互。这能不仅为我们节省不少开发时间,而且将重点放在了Python与C++之间数据对接上,而不是通过纯Python直接和数据库服务进行交互。
C++ 驱动已经是进过严格测试的产品模块,通过Python对所提供的接口进行再一次的封装,使之对客户透明。而Python的简单易用和与C/C++无缝交互的天生属性,可以为客户提供更方便的服务。
Python简单得令人发指,可以不用关心对象的回收问题(当然,在C++这一层,必须关系对象的生命周期),可以返回多个对象,语法更接近自然语言。然而,简单的背后,是语言开发维护者辛勤的付出。
一下,对近期写Python驱动的一些总结:
1、在Python中,一切都是对象,就连None也是对象。
2、@classmethod是一个属性,它的调用,需要提供cls参数,是类方法,未加任何属性说明的函数,需要提供self参数,是实例方法。classmethod的声明,可以通过在函数定义前添加@classmethod 关键字声明。
3、python语言没有提供单独的int64,或者long long 类型,因为long已经足够。但是在传递到C++这层的时候,需要int64或者long long类型参数,则需要用Python传入PyLong的对象,然后通过PyLong_AsLongLong进行转换。
4、在C++层,不能直接返回的NULL,需要转换成Py_None,否则会抛出 SystemError 异常。
5、在C/C++中,需要对各种类型,进行转换才能返回给Python使用,因为Python的一切都是对象。关键接口是 Python.h中的 Py_BuildValue。你可以根据需要,返回一个或多个返回值。
6、还有不少,总之,python给我带来了很多方便的地方。
当然,一门语言被用的火热的时候,少不了别人骂。我也栽到过不少坑:
1、著名的缩进问题,因为在linux环境下,用vim写代码,由于缩进的问题,一个错误,让我找了好久。
2、Python的GC是基于引用计数的,在Python这层,可以肆无忌惮的使用,但是到了C/C++这层,对于引用Python传递下来的对象,需要主动使用Py_XINCREF 和 Py_XDECREF来增加和减少引用计数,不得不吐槽,在Python和C/C++交互的时候,Python的引用计数显得很鸡肋。引用计数问题,我更愿意封装一个smart_ptr来实现,而不是每次引用的时候,还去自己写一行语句去增加和减少引用。例如在C++返回Py_None的时候,你需要先去Py_XINCREF(Py_None),然后返回Py_None。
3、没有提供enum等原型,在众多错误码中,我不得不写一个class去实现形如const的值系列。
经过一个月的调研,开发,测试,我觉得我对Python有了一定的认识,曾经叨叨想学而一直没有好好学的语言,在工作的压力下,一个周就搞定。
在工作的基础上,成长的速度,要比自己业余东看看西学学快得多。
接着上月的汇编语言定位,查找内存出错等core问题之后,本月又学习了更深一层:通过汇编及栈桢,逆向定位和排查因为栈溢出导致寄存器数据被冲导致的程序崩溃。
=====>THE END<=====
总结:Python学习 和 Python与C/C++交互的更多相关文章
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day05 - Python基础(3) 格式化输出和基本运算符
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习笔记—Python基础1 介绍、发展史、安装、基本语法
第一周学习笔记: 一.Python介绍 1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- python学习笔记-python程序运行
小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...
- Python学习(一) Python安装配置
我本身是Java程序猿,听说Python很强大,所以准备学习一下Python,虽说语言都是相同的,但java跟python肯定还是有区别的.希望在此记录一下自己的学习过程. 目前,Python分2.X ...
- python学习: 优秀Python学习资源收集汇总--转
Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...
- Python学习day07 - Python进阶(1) 内置方法
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习之Python简介
Python简介 Python的由来 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象.解释型计算机程序设计语言,它是吉多·范罗苏姆(Guide van ...
- python学习之python安装
1.下载python源码包 wget https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tar.xz 2.下载 xz yum -y insta ...
随机推荐
- 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)
记得上<数据结构>课程时,利用栈的特性解决过四则混合运算表达式.而如今在编写小型关系数据库的时候,编译部分要处理where后面的逻辑表达式——检查语法正确与否的同时,还要将信息传给下一个接 ...
- httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond 错误原因和解决方法
原因:httpclient 之前与服务端建立的链接已经失效(例如:tomcat 默认的keep-alive timeout :20s),再次从连接池拿该失效链接进行请求时,就会保存. 解决方法:官方链 ...
- [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组
Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...
- Code Chef February Challenge 2019题解
传送门 \(HMAPPY2\) 咕 话说这题居然卡\(scanf\)的么??? int T;cin>>T; while(T--){ cin>>n>>a>> ...
- django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)
OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法.通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源.可以说这是 ...
- 安装zlib的过程(Compression requires the (missing) zlib module)(Python2.6升级为2.7出现的问题)
觉得有必要把解决问题的过程写下来 1,因为要安装flask,所以安装pip,所以安装setuptools,所以安装zlib.(具体过程http://www.cnblogs.com/aiyr/p/726 ...
- Hadoop虚拟机的jdk版本和本地eclipse的版本不一致怎么办
在本周学习Hadoop遇到了一个问题,困扰了半天,本人在安装Hadoop时是按照视频来的,结果发现Hadoop上的jdk版本和本地eclipse的版本不一致,导致本地的程序到处jar包传到虚拟机上运用 ...
- Springmvc之表单验证
1.需要的相关jar 这里采用的是hibernate-validator-5.2.4.Final 和validation-api-1.1.0.Final 两个jar包.Hibernate Valida ...
- windows phpinfo上不能找到memcache扩展 php版本5.6
我的memcache用的我是memcached-win64-1.4.4-14.zip这个版本memcache扩展库下载地址:http://windows.php.net/downloads/pecl/ ...
- Vue.js 动态挂载子组件
直接来实例 父组件 <template> <div> <div :is="sub.content" :ref="sub.name" ...