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了。
Python C扩展的更多相关文章
- Python 7 —— 扩展与嵌入
Python 7 —— 扩展与嵌入 所谓扩展是指,在Python当中调用其他语言,由于Python的问题主要是效率,这里的扩展主要是指扩展C C++程序(重点) 所谓嵌入是指,在其他语言当中可以调用P ...
- windows 下 使用codeblocks 实现C语言对python的扩展
本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展 ...
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...
- Python C++扩展
Python C++扩展 前段时间看了一篇文章,http://blog.jobbole.com/78859/, 颇有感触,于是就结合自己工作中的知识作了一个简单的Python移动侦测:移动侦测的算法使 ...
- Python3.x:python: extend (扩展) 与 append (追加) 的区别
Python3.x:python: extend (扩展) 与 append (追加) 的区别 1,区别: append() 方法向列表的尾部添加一个新的元素.只接受一个参数: extend()方法只 ...
- python基础扩展(二)
python基础扩展(二) 常用操作 1.startswith(以什么开始) endswith(y)什么结束 s='taiWanw39dd' print(s.startswith('t')) #意思是 ...
- Python之扩展包安装
读者朋友,在比较新的版本(Python 2 >=2.7.9 or Python 3 >=3.4)中,pip或者easy_install 扩展包命令已经默认安装(可查看 你的安装目录\p ...
- window环境下安装 pip 工具 【pip为Python的扩展管理工具】
Python有一些扩展管理工具,例如easy_install和pip工具,我推荐各位使用pip工具,因为pip工具具有很好的安装和卸载体验. 我们首先需要打开pip的官方网站, 下载必要的文件包,然后 ...
- Python 数据处理扩展包: numpy 和 pandas 模块介绍
一.numpy模块 NumPy(Numeric Python)模块是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list str ...
- Python和C++的混合编程(使用Boost编写Python的扩展包)
想要享受更轻松愉悦的编程,脚本语言是首选.想要更敏捷高效,c++则高山仰止.所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中.原来贡献过一篇<c++和js的混合编程>也是 ...
随机推荐
- 将自定义工程加入到python根目录下
1. 在D:\Program Files\Python\Lib\site-packages 添加.pth文件,文件名为模块名称(即auto_XXX),文件内容为模块所在目录.(python添加自定义的 ...
- web 项目添加 x86 的dll 引用,模块 DLL c:\WINDOWS\system32\inetsrv\aspnetcore.dll 未能加载。
最近的项目要添加一个 x86 编译的dll, 首先添加引用,编译,报错: 首先判断是 项目中不能添加 x86 的引用,所以把所有的项目都按照 x86 的方式编译一遍,同时对应IIS 的应用池,也修改为 ...
- PP: Modeling extreme events in time series prediction
KDD: Knowledge Discovery and Data Mining (KDD) Insititute: 复旦大学,中科大 Problem: time series prediction; ...
- laravel的Validation检索验证错误消息
基本用法 处理错误消息 错误消息和视图 可用的验证规则 有条件地添加规则 自定义错误消息 自定义验证规则 基本用法 Laravel提供了一个简单.方便的工具,用于验证数据并通过validation类检 ...
- python vs java Threadpool
python 实现threadpool线程池管理: from concurrent.futures import ThreadPoolExecutor as te from concurrent.fu ...
- python实现进度条下载
核心代码: for i in range(10): print('\r' + '>' * i, end='') 示例展示以搜狗输入法为例: import timeimport requestsi ...
- vue组件插槽与编译作用域
<!DOCTYPE html> <html> <head> <title></title> </head> <script ...
- mybatis(二):缘由
本是Apache的一个开源项目iBatis 2010年,iBatis由Apache Software Foundation(软件基金会)迁移到了Google Code(代码托管平台),并改名为MyBa ...
- jdk8-》allMatch、anyMatch、max、min函数
allMatch函数: 检查是否匹配所有元素,只有全部符合才返回true boolean flag = list.stream().allMatch(obj->obj.length()>5 ...
- 《深入理解Java虚拟机》读书笔记十
第十一章 晚期(运行期)优化 1.HotSpot虚拟机内的即时编译 解释器与编译器: 许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生 ...