Python C扩展

可以用C写一个module,可提供给Python使用。

#include <Python.h>
#include <stdio.h>
void Print_PyObject(PyObject *obj)
{
  Py_ssize_t size = 0;
  PyObject *subObj = NULL;
  PyObject *key = NULL;
  Py_ssize_t pos = 0;
  if (NULL == obj)
  {
    return;
  }
  if (Py_None == obj)
  {
    printf("obj is py_none");
  }
  else if(PyBool_Check(obj))
  {
    printf("obj is bool");
  }
  else if(PyInt_CheckExact(obj))
  {
    printf("obj is int : %ld\n", PyInt_AsLong(obj));
  }
  else if(PyFloat_CheckExact(obj))
  {
    printf("obj is Float: %f\n", PyFloat_AsDouble(obj));
  }
  else if(PyString_CheckExact(obj))
  {
    printf("obj is string:%s\n", PyString_AsString(obj));
  }
  else if(PyList_CheckExact(obj))
  {
    printf("obj is list\n");
    size = PyList_Size(obj);
    int idx = 0;
    for (idx = 0; idx < size; idx++)
    {
      subObj = PyList_GetItem(obj, idx);
      Print_PyObject(subObj);
    }
  }
  else if(PyList_CheckExact(obj))
  {
    printf("obj is dict\n");
    while (PyDict_Next(obj, &pos, &key, &subObj))
    {
      Print_PyObject(subObj);
    }
  }
}
static PyObject *PyExt_Set(PyObject *self, PyObject *args)
{
  printf("PyExt_set!\n");
  PyObject *newObject;
  const char *uri;
  if (!PyArg_ParseTuple(args, "sO!", &uri, &PyDict_Type, &newObject) &&
    !PyArg_ParseTuple(args, "sO!", &uri, &PyList_Type, &newObject))
  {
    return Py_BuildValue("i", -1);
  }
  printf("uri:%s\n", uri);

  return Py_BuildValue("i", 0);
}
static PyMethodDef PyExtMethods[] ={
  {"Set", PyExt_Set, METH_VARARGS, "Perform Set Operation"},
  {NULL, NULL, 0, NULL}
};
void initPyExt(void)
{
  //PyImport_AddModule("PyExt");
  Py_InitModule("PyExt", PyExtMethods);
}

在C module中会提供一个Set 方法。

然后编写setup.py

from distutils.core import setup, Extension
setup(name=‘PyExt‘, version=‘1.0‘, ext_modules=[Extension(‘PyExt‘, sources=[‘PyExt.c‘])])

编译:python setup.py build

安装:python setup.py install

就可以在python中import PyExt了。

时间: 2024-07-30 18:39:15

Python C扩展的相关文章

在python中扩展c语言模块

有一个以前写的c语言代码,我想把它用在python程序中.我先是看了<python基础教程>一书中的方法,书中说可以用swig加python内置distutils模块的方法来实现.我照着书上的步骤试了试,结果在导入模块的时候总是提示"ImportError: dynamic module does not define init function (initprintf)".起初我以为是so文件没有放对位置.但是我试着在目录中建立了一个简单的python模块,然后再导入,发

使用Cython为Python写扩展1:初识Cython

使用Cython为Python写扩展1:初识Cython Cython使为Python写C扩展就如同写Python代码一样简单.广泛用于数学软件包,SAGE公司,作为执行快速,可扩展的运算.它提供了安全和可维护的方法通过自动生成所需代码来构建原生Python模块. 我们经常会使用Cython将C/C++实现的系统绑定到Python中,这样我们就可以使用Python来处理高级别逻辑,原生模块来处理底层代码. 关于示例 代码 http://git.oschina.net/erhuabushuo/le

windows 下 使用codeblocks 实现C语言对python的扩展

本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自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

Python3.x:python: extend (扩展) 与 append (追加) 的区别

Python3.x:python: extend (扩展) 与 append (追加) 的区别 1,区别: append() 方法向列表的尾部添加一个新的元素.只接受一个参数: extend()方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中: 2,示例: list_extend = ['a', 'b', 'c'] list_extend.extend(['d', 'e', 'f']) print("list_extend:%s" %list_extend) # 输

python安装扩展”unable to find vcvarsall.bat“的解决办法

产生原因: python3.4用的是msvs2010编译的,所以python3.4默认只能认出msvs2010. python2.7用的是msvs2008编译的,所以python2.7默认只能认出msvs2008. 方法一:安装mingw(不推荐) 下载mingw环境,添加环境变量 或者使用 python setup.py build –compiler=mingw32   方法二:安装对应版本的msvs python2安装msvs2008,python3安装msvs2010.   方法三:设置

Python 数据处理扩展包: numpy 和 pandas 模块介绍

一.numpy模块 NumPy(Numeric Python)模块是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)).据说NumPy将Python相当于变成一种免费的更强大的MatLab系统. NumPy模块提供了许多高级的数值编程工具,如:矩阵数据类型.矢量处理,以及精密的运算库等. 1).一个强大的N维数组对象Array: 2).比较成熟

【Python笔记】如何用C语言实现Python第三方扩展包

Python支持C/C++实现的第3方扩展包,在性能要求高的场合,这种特性显得尤其重要. 本文以实例说明定制Python扩展包的基本步骤. 1. 扩展包源码实现 按照Python官网教程Extending Python with C or C++说明的步骤,扩展模块的源文件实现如下: #include <Python.h> // forward declaration void initpyext(void); // self-defined error obj static PyObject

centos 安装 python 以及扩展

在一个新服务器上安装python环境.之前安装过好多次,但是都没有总结过,今天需要重新安装,发现还是听费尽的,所以决定总结一下,希望下一次在重新安装的时候可以快一点搞定. 首先是下载python2.7,在服务器上,就用wget 吧. 下载用这个链接,https://www.python.org/downloads/release/python-279/ 我们需要的是2.7版本,所以选择了这个.选择tgz格式的source code就可以了. wget https://www.python.org

window环境下安装 pip 工具 【pip为Python的扩展管理工具】

Python有一些扩展管理工具,例如easy_install和pip工具,我推荐各位使用pip工具,因为pip工具具有很好的安装和卸载体验. 我们首先需要打开pip的官方网站, 下载必要的文件包,然后我们解压文件包,即可看到 setup.py ,最后我们把文件包复制到python安装目录下,在命令行模式下运行安装命令即可. 安装命令:setup.py install

Python之扩展包安装(scikit learn)

scikit learn 是Python下开源的机器学习包.(安装环境:win7.0 32bit和Python2.7) Python安装第三方扩展包较为方便的方法:easy_install + packages name 在官网 https://pypi.python.org/pypi/setuptools/#windows-simplified 下载名字为 的文件. 在命令行窗口运行 ,安装后,可在python2.7文件夹下生成Scripts文件夹.把路径D:\Python27\Scripts