码迷,mamicode.com
首页 > 编程语言 > 详细

Python C扩展

时间:2016-12-18 01:10:50      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:pos   python   ini   nbsp   mod   bool   eth   *args   opera   

可以用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扩展

标签:pos   python   ini   nbsp   mod   bool   eth   *args   opera   

原文地址:http://www.cnblogs.com/fellow1988/p/6193391.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!