扩展Python模块系列(一)----开发环境配置

本系列将介绍如何用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/doc/html/index.html

3. Cython. Cython其实是一个可以优化Python程序的编译器,将Python代码翻译成C代码,然后使用C/C++编译器进行编译得到pyd(windows)或so(linux),在Python解释器中可以直接import。这种方法里面的坑有点多,在本系列博客中会介绍到Cython。   http://cython.org/

4. 谷歌最近开源的CLIF项目,同时支持Python2和Python3,目前来说还不太完善。  https://github.com/google/clif

其他的框架。。。。。。

本篇将介绍如何用官方提供的Python C/C++ API来扩展Python模块。工欲善其事必先利其器,先讲一下如何搭建开发环境(默认已经安装了Python)。以下为【DEBUG】版的配置:

1. Python版本: Python2.7 32位;   操作系统: Windows7;  IDE: Visual Studio 2017。

2. 配置Library Directories、Additional Include Directories、Link Input

3. 写一段hello world程序 ,先不纠结语法细节

[test.c]

#include <Python.h>

static PyMethodDef test_methods[] = { NULL, NULL, 0, NULL };

PyMODINIT_FUNC test_init(void)
{
    Py_InitModule3("test", test_methods, "Common test Written in C.");
}

[Souce.cpp]

#include <Python.h>

PyMODINIT_FUNC test_init();

int main()
{
    Py_Initialize();
    test_init();
    return 0;
}

然后编译,很大可能会出现Link时找不到解析符号以及无法找到python27_d.lib,这主要是pyconfig.h里代码的一些宏导致的。

1)找到python2.7/include/pyconfig.h,并找到

#ifdef _DEBUG
#define Py_DEBUG
#endif

修改为

#ifdef _DEBUG
//#define Py_DEBUG
#endif

2)Configuration Properties->C/C++->Preprocessor->Preprocessor Definitions添加MS_NO_COREDLL或Py_NO_ENABLE_SHARED

原因解释:

1)

在pyconfig.h中:

#ifdef _DEBUG
#define Py_DEBUG
#endif

在object.h中有以下定义:

/* Py_DEBUG implies Py_TRACE_REFS. */
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
#define Py_TRACE_REFS
#endif

在modesupport.h中

#ifdef Py_TRACE_REFS
 /* When we are tracing reference counts, rename Py_InitModule4 so
    modules compiled with incompatible settings will generate a
    link-time error. */
 #if SIZEOF_SIZE_T != SIZEOF_INT
 #undef Py_InitModule4
 #define Py_InitModule4 Py_InitModule4TraceRefs_64
 #else
 #define Py_InitModule4 Py_InitModule4TraceRefs
 #endif
#endif

所以当定义了Py_DEBUG,就会导致Py_InitModule4重命名为Py_initModule4TraceRefs,而lib中没有此符号,所以导致了链接错误。故而注释掉#define Py_DEBUG这一行即可。

2)找不到python27_d.lib问题

同样在pyconfig.h中:

/* For Windows the Python core is in a DLL by default.  Test
Py_NO_ENABLE_SHARED to find out.  Also support MS_NO_COREDLL for b/w compat */
#if !defined(MS_NO_COREDLL) && !defined(Py_NO_ENABLE_SHARED)
#    define Py_ENABLE_SHARED 1 /* standard symbol for shared library */
#    define MS_COREDLL    /* deprecated old symbol */
#endif /* !MS_NO_COREDLL && ... */

/*  All windows compilers that use this header support __declspec */
#define HAVE_DECLSPEC_DLL

/* For an MSVC DLL, we can nominate the .lib files used by extensions */
#ifdef MS_COREDLL
#    ifndef Py_BUILD_CORE /* not building the core - must be an ext */
#        if defined(_MSC_VER)
            /* So MSVC users need not specify the .lib file in
            their Makefile (other compilers are generally
            taken care of by distutils.) */
#            ifdef _DEBUG
#                pragma comment(lib,"python27_d.lib")
#            else
#                pragma comment(lib,"python27.lib")
#            endif /* _DEBUG */
#        endif /* _MSC_VER */
#    endif /* Py_BUILD_CORE */
#endif /* MS_COREDLL */

可以看到如果没有定义MS_NO_COREDLL和Py_NO_ENABLE_SHARED时,会定义MS_COREDLL,然后在DEBUG模式下会加载python27_d.lib。所以在Preprocessor Definitions中定义MS_NO_COREDLL即可解决。

4. 编译&链接错误解决之后,可以正常运行。

上面的例子中,test.c定义了一个模块test,在Source.cpp中初始化了该模块。下一节将用一个例子来详细介绍使用Python C/C++ API扩展Python模块。

时间: 2024-07-30 23:54:24

扩展Python模块系列(一)----开发环境配置的相关文章

扩展Python模块系列(五)----异常和错误处理

在上一节中,讨论了在用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在Windows下开发环境配置汇总

最近比较关注学习Python方面的资料和课程,由于Python本身基本都是在Linux下开发,本人windows用习惯了初用Linux各种别扭啊. 下面将我在配置Windows环境下的禁言写出来,与大家分享. 1.下载与安装Python 1.Python官方网址:https://www.python.org 2.点击DownLoad后选择适合自己的版本进行下载. 3.下载完成后,直接安装包安装一路Next. 4.然后配置环境变量,为计算机添加安装目录搭到环境变量,如图把python的安装目录添加

VS2015下的Android开发系列01——开发环境配置及注意事项

概述 VS自2015把Xamarin集成进去后搞Android开发就爽了,不过这安装VS2015完成的时候却是长了不知道多少.废话少说进正题,VS2015安装时注意把Android相关的组件勾选安装,别组件都没安装就来用VS搞Android开发. VS2015的Android组件安装完成后并不是什么都不用做了,要注意三个问题: 需要自己下载Android SDK JDK的版本 HAXM的安装 下载Android SDK 推荐下载地址:http://sdk.android-studio.org/

PHP开发环境配置系列(四)-XAMPP常用信息

PHP开发环境配置系列(四)-XAMPP常用信息 博客分类: PHP开发环境配置系列 xamppphp 完成了前面三篇后(<PHP开发环境配置系列(一)-Apache无法启动(SSL冲突)> .<PHP开发环境配置系列(二)-XDebug设置> .<PHP开发环境配置系列(三)-项目源码映射> ),今天补充一下XAMPP的一些常用信息(<PHP开发环境配置系列(四)-XAMPP常用信息> ),有备无患.     1. XAMPP的启动路径     xampp

tmp 20191101-----windows vim python开发环境配置

安装下载windows git 官网 https://git-scm.com/downloads 淘宝源 http://npm.taobao.org/mirrors/git-for-windows/ 默认选项安装 安装后git自动加到环境变量,C:\Program Files\Git\usr\bin也加到环境变量,这个文件夹下有vim.ext, ssh.exe, scp.exe 而且安装git过程中同时安装的vim支持python2和python3 vim --version查看 验证vim p

centos7.0 安装日志--图文详解-python开发环境配置

centos7.0发布之后,就下载了everthing的DVD镜像,今天有时间,所以决定在vbox底下体验一番--- 上图: 默认是体验安装,作为一个忠实粉丝,我决定选择直接安装! 这个界面是这次新版本更新后改的,它把以前要下一步.上一步可以修改的操作全部集中到一个页面来,默认选择是下图这样,比如你想修改软件安装选项只要点击相应选项就可以了. 每次你更改安装选项之后,它都会自动从新计算安装源,如果你的选择的资源本地没有,还可以通过网络来安装,默认网络是不启用的,所以我们需要自己手工设置一下网络.

java web开发环境配置系列(二)安装tomcat

在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<java web开发环境配置系列>来祭奠那逝去的--1.下载tomcat压缩包,进入官网http://tomcat.apache.org/,官网左侧有对应的下载列表,选择适合自己的版本,进入下载页面,这里下载的是64-bit Windows zip 2.下载后,解压到指定的文件目录中,如:D:\Program Files\tomcat 3.配置环境变量(右击"我的电脑"

java web开发环境配置系列(三)安装eclipse

在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<java web开发环境配置系列>来祭奠那逝去的--1.下载eclipse安装包,下载地址https://www.eclipse.org/downloads/,官方提供了几种工具平台,这里使用的是Eclipse Neon 2.下载后,以管理员身份安装安装包 1)选择适合自己开发方向的开发工具 2)选择后,进入下一步,配置自己的安装路径,并点击安装即可 3)安装好后,第一次打开eclips

spark开发环境配置

以后spark,mapreduce,mpi可能三者集于同一平台,各自的侧重点有所不用,相当于云计算与高性能计算的集合,互补,把spark的基础看了看,现在把开发环境看看,主要是看源码,最近Apache Spark源码走读系列挺好的,看了些.具体环境配置不是太复杂,具体可以看https://github.com/apache/spark 1.代码下载 git clone https://github.com/apache/spark.git 2.直接构建spark 我是基于hadoop2.2.0的