博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python C扩展
阅读量:5892 次
发布时间:2019-06-19

本文共 1958 字,大约阅读时间需要 6 分钟。

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

 

 

转载于:https://www.cnblogs.com/fellow1988/p/6193391.html

你可能感兴趣的文章
每天一个linux命令(25):linux文件属性详解
查看>>
【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
查看>>
HDU 3280 Equal Sum Partitions(二分查找)
查看>>
第一个之出现一次的字符
查看>>
go微服务框架go-micro深度学习(三) Registry服务的注册和发现
查看>>
expectFAQ(附一个python批量任务脚本)--持续更新
查看>>
HDU 2492 Ping pong
查看>>
JPA的Embeddable注解
查看>>
Maven在Eclipse中的实用小技巧
查看>>
步步为营Hibernate全攻略(一)构建Hibernate框架环境
查看>>
【开放源代码】【谐波数据生成器】【上位机软件】(版本:0.00)
查看>>
Hibernate基础-HelloWord
查看>>
提高查询速度方法总结
查看>>
Android开发指南(30) —— Multimedia and Camera
查看>>
在Android中使用mkdir在sdcard中创建文件夹出错
查看>>
nova network工作原理及配置
查看>>
SQL语句AND 和 OR执行的优先级
查看>>
Android Studio系列教程四--Gradle基础
查看>>
在ASP.NET MVC3 中利用JSONP跨域登录WEB系统
查看>>
事件绑定的几种常见方式
查看>>