可以用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了。

Python C扩展的更多相关文章

  1. Python 7 —— 扩展与嵌入

    Python 7 —— 扩展与嵌入 所谓扩展是指,在Python当中调用其他语言,由于Python的问题主要是效率,这里的扩展主要是指扩展C C++程序(重点) 所谓嵌入是指,在其他语言当中可以调用P ...

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

    本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展 ...

  3. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)

    我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...

  4. Python C++扩展

    Python C++扩展 前段时间看了一篇文章,http://blog.jobbole.com/78859/, 颇有感触,于是就结合自己工作中的知识作了一个简单的Python移动侦测:移动侦测的算法使 ...

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

    Python3.x:python: extend (扩展) 与 append (追加) 的区别 1,区别: append() 方法向列表的尾部添加一个新的元素.只接受一个参数: extend()方法只 ...

  6. python基础扩展(二)

    python基础扩展(二) 常用操作 1.startswith(以什么开始) endswith(y)什么结束 s='taiWanw39dd' print(s.startswith('t')) #意思是 ...

  7. Python之扩展包安装

    读者朋友,在比较新的版本(Python 2 >=2.7.9 or Python 3 >=3.4)中,pip或者easy_install 扩展包命令已经默认安装(可查看   你的安装目录\p ...

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

    Python有一些扩展管理工具,例如easy_install和pip工具,我推荐各位使用pip工具,因为pip工具具有很好的安装和卸载体验. 我们首先需要打开pip的官方网站, 下载必要的文件包,然后 ...

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

    一.numpy模块 NumPy(Numeric Python)模块是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list str ...

  10. Python和C++的混合编程(使用Boost编写Python的扩展包)

    想要享受更轻松愉悦的编程,脚本语言是首选.想要更敏捷高效,c++则高山仰止.所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中.原来贡献过一篇<c++和js的混合编程>也是 ...

随机推荐

  1. NOI2005 维护数列 lg2042

    这道题据说是noi题目中算是比较毒瘤的数据结构题了,5k多的代码加上随手写挂细节,我调了两天 题面见https://www.luogu.org/problemnew/show/P2042 (歪个题,这 ...

  2. python笔记20(面向对象课程二)

    今日内容 类成员 成员修饰符 内容回顾 & 补充 三大特性 封装 函数封装到类 数据封装到对象 * class Foo: def __init__(self,name,age): self.n ...

  3. VNCserver 安装 及 oracle过程总结

    一.安装桌面系统 1.命令   yum grouplist ---列举系统中以组安装的包(组安装的包会包括很多,组安装一下就就可以安装很多附在的包.) 2.  yum groupinstall &qu ...

  4. Django教程(2)

    from Django official document; Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发. from 编写你的第一个 Django 应用, ...

  5. paper: VG -- re-read

    重点:  1.The constructed graph inherits several properties of the series in its structure. periodic se ...

  6. SpringCloud大白话之服务注册中心

    SpringCloud-Eureka白话说明 eureka.client.register-with-eureka 属性表示是否将自己注册到Eureka Server, 默认为true. 由于当前应用 ...

  7. C变量常量

    变量是指其值可以变化的量.计算机中,指令代码.数据都存储于内存中.变量也需要存储在内存中.在计算机中,每个变量都被分配了一块内存空间,在这些空间里存储的就是变量的值.变量之所以可以变化,就是这个存储空 ...

  8. ubuntu查看系统负载和程序运行状况

    1,没有图形化界面 纯文字:top 美化的文字界面:htop 2,图形界面查看系统状态: gnome-system-monitor(或者在搜索界面中搜索system monitor) 3,jetson ...

  9. css公共

    @charset "utf-8"; /* CSS Document */ *{ padding:; margin:; } ul,li{ list-style: none; } a{ ...

  10. js面向对象的程序设计 --- 下篇 继承启蒙

    继承是oo语言中一个最为人津津乐道的概念.ECMAScript支持实现继承,而且实现继承只要是靠原型链来实现的 ·原型链 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾一 ...