python3.2下调用C动态链接库

本文介绍如何使用Python结合C语言提升程序性能。通过具体示例演示如何编写C扩展模块并将其导入Python环境中,实现复杂运算加速。文章涵盖C扩展模块的创建、编译及在Python中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python和C,我觉得这简直是无敌的组合啊。一般性的业务逻辑用python快速出模型,而碰到python运行缓慢的操作,则可以通过调用C编译好的链接库来完成。
在python3.2下,可以通过ctype模块单纯的访问C链接库,也可以通过传统方式访问。ctype模块固然方便,但若要求回调的话,还是得用传统方式操作。

今天查阅了官方manual和网上一些链接,感觉有些出处,在这写上一个3.2.2的简单程序:
编辑一个文件lzymodule.c
按官方命名方式,前面是模块名,后面是module.c
#include <Python.h> //必须先include Python.h,Python.h中包含了一些预编译宏,包括了一些stdlib.h之类的头文件

/* 将要调用的函数,我提出来了 */
long func1(long a, long b)
{
return a + b;
}

/* 方法名字命名规范是“模块名_方法名”,我这里的方法名是system */
static PyObject *
lzy_system(PyObject *self, PyObject *args)
{
const char *command;
long a, b;
int sts;

if (!PyArg_ParseTuple(args, "ii", &a, &b)) //读入两个整形参数,转成C类型
return NULL;

//sts = system(command);
sts = func1(a, b);
return PyLong_FromLong(sts); //返回前,需要转成PyObject类型
}

/* 定义模块中的方法 */
static PyMethodDef LzyMethods[] =
{
{"func", lzy_system, METH_VARARGS, "my first test function"}, //注意func是在python中调用的名字,这里应该取system才规范
{NULL, NULL, 0, NULL}
};

/* 定义模块 */
static struct PyModuleDef lzymodule =
{
PyModuleDef_HEAD_INIT,
"lzy",
NULL,
-1,
LzyMethods
};

/* 这个就相当于主函数了,命名一定要为“PyInit_模块名” */
PyMODINIT_FUNC PyInit_lzy(void)
{
return PyModule_Create(&lzymodule);
}


之后进行编译
gcc lzymodule.c -shared -I /usr/local/include/python3.2m/ -o lzy.so -fPIC


最后进入python,试试
import lzy
lzy.func(1, 230)


有疑问请跟帖。

注,不愿意gcc的话,试试这个[url=http://hi.baidu.com/cyclone/blog/item/8ee887d618722c2207088b1a.html]脚本[/url]
from distutils.core import setup, Extension
test_mod = Extension('lzy', sources = ['lzymodule.c'])
setup(name = 'lzy',
version = '1.0',
description = 'lzy test extension module',
ext_modules = [test_mod])

python setup.py build
python setup.py install
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值