用 C 扩展 python】的更多相关文章

用python脚本写应用比较方便,但有时候由于种种原因需要扩展python(比如给程序提供python接口等). 之前一直想整理下,今天终于坐下来把这件事情给做了,这里记录下,也方便我以后查阅. 说明: 测试环境中操作系统为CentOS6.5_x64,python版本为2.6 直接调用动态库 1.编写模块动态库文代码 这里以求最大数为示例 代码(callTest1.cpp)如下: extern "C" { int Max(int i1,int i2) { return (i1>i…
本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:windows xp, gcc.exe 4.7.2, Python 3.2.3. 第一步 撰写C语言的DLL 创建一个 clip.c 文件,内容如下: // 设置 UNICODE 库,这样的话才可以正确复制宽字符集 #define UNICODE #include <windows.h> #include &…
使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python进行功能性扩展,可以这样理解,使用更高效的语言实现一些算法计算等等需要更高执行效率的核心(或者需要与系统进行密切交互的)模块,然后让Python像调用内建标准库的方式来调用这些模块,听起来是不是很…
1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \  C/C++中调用python文件. #include "Python.h" 然后定义一个模块的初始化函数 PyMODINIT_FUNC initlc_hello_world(void){ Py_InitModule("lc_hello_world",lc_hello_world_methods);} 这个函数是用于模块初始…
基本想法: 先看中文小介绍,再看英文详细文档. 1. 参考 首先参考THIS, IBM的工程师好像出了好多这样的文章啊,而且每次看到时间戳,我都想戳自己- -! 2. ERROR 可能遇到错误: fatal error: Python.c: No such file or directory a. 参考THIS :  b. 或许用  sudo apt-get install python2.7-dev,命令就能解决(江湖传闻,只用于ubuntu) : c. python2.7-dev 是什么?T…
在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数的参数解析与函数结果返回的封装. 参数解析 最常用的接口是 int PyArg_ParseTuple(PyObject *arg, char *format, ...); arg是一个tuple object,从python传递给C函数:format参数必须是一个字符串,通常每个字符代表一种类型:剩…
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两个点之间的距离. 可以在Python代码这样使用test模块: import test s = test.distance((0, 0, 0), (1, 1, 1)) 先上代码: [test.c] #include <Python.h> #include <math.h> static…
本系列将介绍如何用C/C++扩展Python模块,使用C语言编写Python模块,添加到Python中作为一个built-in模块.Python与C之间的交互目前有几种方案: 1. 原生的Python C/C++ API, 官网有非常详细的文档说明 2. boost python,一个C++的编程框架,对官方API进行了封装,可以方便的用C++扩展Python模块,省去了很多诸如引用计数的烦恼. http://www.boost.org/doc/libs/1_64_0/libs/python/d…
承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最头疼的地方,需要由程序员对使用的每个C API都要充分了解,甚至要熟悉源码才能精确掌握什么时候引用计数加一,什么时候减一. 本文为翻译文章,我觉得对于源码中的引用计数讲解得比较清楚,所以就翻译为中文.http://edcjones.tripod.com/refcount.html# Summary:…
在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_DECREF.在编写C语言代码时,需要了解Python提供的C/C++ API的实现细节,特别是有的API内部实现会调用Py_INCREF,这时自己编写的函数可能需要调用Py_DECREF,而有的API内部实现只是borrowed reference,此时一般不应该调用Py_DECREF. 本节讨论…
"中文编程"知乎专栏原文地址 续前文扩展Python控制台实现中文反馈信息, 实现了如下效果: >>> 学 Traceback (most recent call last): File "<console>", line 1, in <module> 命名错误: 命名'学'未定义 >>> [1] + 2 Traceback (most recent call last): File "<c…
使用.pth文件扩展python环境路径 有时候我们不希望把一个库放到 site-packages 下面,而是更愿意把它保留在原始的工程目录中,方便管理和维护.那么怎么能让 Python 运行环境找到这个库呢?通常的做法是在程序启动的时候,往sys.path里面增加这个目录,但是这样做非常的繁琐,最简单的办法就是使用.pth文件.Python 在遍历已知的库文件目录过程中,如果见到一个 .pth 文件,就会将文件中所记录的路径加入到 sys.path 设置中,于是 .pth 文件所指明的库也就可…
python底层是用c写的,c本身是一个非常底层的语言,所以它做某些事情的效率肯定会比上层语言高一些. 比如有些自动化测试用的python库,会对系统的UI进行一些捕获,点击之类的操作,这必然要用到c,实际上这些库就是用c来扩展的.先用c写一些调用系统UI的接口,然后把它封装成python方法. 下面是一个简单的用C来扩展python的例子: test.c #include "Python.h" static PyObject *pr_getsum(PyObject *self,PyO…
c, c++, java比python快几个数量级. 17.1 考虑哪个更重要 开发速度还是运行速度更重要. 17.2 非常简单的途径:Jython和IronPython Jython可以直接访问JAVA标准库. IronPython中可以直接访问C#标准库. 17.3 编写C语言扩展 扩展Python通常就是扩展CPython,是用c语言实现的标准Python版本. 17.3.1 SWIG swig是简单包装和接口生成器的缩写,是一个能用于几种语言的工具.一方面,可以通过它使用c语言或者C++…
第二十一章. 扩展Python /* D:\Python27\Lib\Extest-1.0\Extest2.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "Python.h" int fac(int n) { if (n < 2) return(1); return (n)*fac(n-1); } static PyObject * Extest…
[保持在百度网盘中的, 可以在观看,嘿嘿 内容有点多,要想下载, 回复后就可以查看下载地址,资源收集不易,请好好珍惜] 下载地址:http://www.fu83.cc/ 感觉文章好,可以小手一抖 -------------------------说正文------------------------ 第一阶段:python基础准备: Web前端开发之HTML+CSS基础入门: 课程章节 1.课程介绍 2.html的语法 3.html的基本结构 4.html的文档设置标记上(格式标记) 5.htm…
有许多理由给CPython写扩展,比如 1.性能低 2.重复用别人的C/C++代码 3.在自己的程序中定制python 4.为了方便 等等. 写这种扩展其实都是套路,不过最好要有对CPython源码有点熟悉. 添加C完成的 module有两种方法 1.直接修改python源代码,写好自己的module.静态编译到CPython中去. 2.将module做成dll(pyd)文件,然后动态加载. 套路 Python代码调用C代码套路: 将被调用C函数包装成一个进PyCFunction函数, 在这个函…
有时候我们不希望把一个库放到 site-packages 下面,而是更愿意把它保留在原始的工程目录中,方便管理和维护. 通常的做法是在程序启动的时候,往sys.path里面增加这个目录,但是这样做非常的繁琐,最简单的办法就是使用.pth文件. Python 在遍历已知的库文件目录过程中,如果见到一个 .pth 文件,就会将文件中所记录的路径加入到 sys.path 设置中,于是 .pth 文件说指明的库也就可以被 Python 运行环境找到了. 这个文件虽然可以放在python的已知库文件的目录…
1. Code & Official_doc: THIS 2. My question. #include <Python.h> /* * 1.PyTypeObject doc, md, 我看了快两天才明白.我是白痴吗? * 这里定义了一个结构体,也就是定义了一个c的类型,名叫 kevin_KevinType. * 2. 回忆一下 c中static, THIS, THIS. */ staticforward PyTypeObject kevin_KevinType; // every…
开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用python的头文件和库. 2.下面是一个最简单的可以供python调用的c扩展模块,假设c程序文件名为foo.c: 代码 #include <Python.h> static PyObject* foo_bar(PyObject* self, PyObject* args) {     Py_R…
"中文编程"知乎专栏原文地址 参考了周蟒的实现, 运行效果如下: $ python3 解释器.py Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 05:52:31) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "…
// https://python3-cookbook.readthedocs.io/zh_CN/latest/c15/p02_write_simple_c_extension_module.html // http://book.pythontips.com/en/latest/python_c_extension.html // https://github.com/python/cpython/blob/master/Modules/_testimportmultiple.c   // h…
https://www.ibm.com/developerworks/cn/linux/l-pythc/…
总结: 1.创建dll工程: 2.增加包含头文件路径 :将python路径下的include加入到包含头文件路径:在工程属性页 C/C++/附加包含目新增<Python>\include目录 3.增加lib路径:链接器/附加库目录添加<Python>\libs目录 4.修改输出文件类型为pyd: 工程属性页/链接器/输出文件,修改输出文件名为hello.pyd 5.以release方式build 6.将生成的pyd文件拷贝到项目目录下或者可以import的lib目录下.   htt…
PythonIDLE中的编码处理 http://www.tuicool.com/articles/NbyEBr 原文标题:Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码 http://www.crifan.com/python_already_got_correct_encoding_string_but_seems_print_messy_code/?utm_source=tuicool python写入带有中文字的字符串到文件 # -*- c…
前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObject* Module_func()的包装函数 c. 为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组 d. 增加模块初始化函数void initMethod() 3. 编译与测试 a. 创建setup.py b. 通过运行setup.py来编译和连接你的代码 c.…
前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObject* Module_func()的包装函数 c. 为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组 d. 增加模块初始化函数void initMethod() 3. 编译与测试 a. 创建setup.py b. 通过运行setup.py来编译和连接你的代码 c.…
本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展很感兴趣,刚好看到了Extending and Embedding the Python Interpreter文档,看的是最低版本(由于工作中用的是2.x, ̄□ ̄),官方文档 链接:http://docs.python.org/2.6/extending/index.html 我使用的IDE是Co…