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的话,试试这个
脚本
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
分享到:
相关推荐
python2.7 python3.2 包含windows,linux,一共5个分卷
1. **Unicode默认编码**:Python3.2开始,字符串默认使用Unicode编码,这是对国际化的进一步支持,使得处理各种字符集变得更加方便。 2. **增强的字典操作**:在Python3.2中,字典的实现有了重大改进,包括更快的...
python3.2 手册 python程序员必备说明书
总结来说,chardet-2.1.1-python3.2是chardet库针对Python 3.2的移植版本,解决了Python 2到Python 3的兼容问题,使得用户可以在Python 3环境下直接安装和使用,进行文本编码检测。其安装过程简单,只需运行`python ...
Python是一种广泛使用的高级编程语言,以其易读性、简洁的语法和强大的功能而闻名。Python 3.2是Python语言的一个重要版本,它在2011年发布,带来了许多新特性和改进。这个"python-3.2.msi"安装包是针对Windows操作...
Python3.2实例 基础 教程 如果你是初学者可以看看,很有帮助的
python环境调用Fortran语言生成的动态链接库(一个简单的示例): 1. main.for integer function mysum(a, b) bind(C,name="mysum") !GCC$ATTRIBUTES DLLEXPORT,CDECL :: mysum integer, value :: a,b mysum =...
MySQL-python-1.2.3.win32-py3.2 用于Python3.2连接MySQL数据库 使用方法见 http://www.cnblogs.com/txw1958/archive/2012/07/22/python3-mysql.html
Python调用C#动态链接库 DLL 案例 python 版本 3.x dll 版本 .net standard 2.0 调用库 clr 安装 pip install pythonnet 调用接口 clr.AddReference
Python_3.2_amd64.msi安装包,64位操作系统的可以安装!
使用`Milksnake`,开发者可以自定义构建过程,以适应特定的动态链接库生成需求。它提供了一个钩子,允许你在`setuptools`构建流程中插入自定义的编译和链接步骤。这使得`Milksnake`成为一个强大的工具,能够处理复杂...
平台:Win32 Python 版本:3.2 Qt版本:4.9
在IT行业中,跨平台编程是一项重要的技能,尤其是在处理系统级任务时。...通过这个过程,你可以了解到如何将C语言的功能封装到动态库中,并在Python中进行调用,这对于提升软件性能和实现复杂功能具有重要意义。
numpy-1.8.0-win32-superpack-python3.2.exe
`python32_d.lib`是对应的导入库文件,它是C/C++编译器在链接时使用的,用于指导链接器如何找到`python32_d.dll`中的函数和数据。当您在VS2005(Visual Studio 2005)中编写Python扩展模块或者Cython代码时,这个库...