51Testing软件测试论坛
标题: Python C 语言扩展 [打印本页]
作者: 测试积点老人 时间: 2018-12-17 15:57
标题: Python C 语言扩展
本帖最后由 测试积点老人 于 2018-12-17 15:58 编辑
1. 创建应用程序代码,用样板包装代码1). 包含 Python 头文件。
2) 为每个模版的每一个函数增加 PyObject * Module_func() 的包装函数。
3) 为每个模块的每一个函数增加 PyMethodDef * ModuleMethods[] 的数组。
4) 增加模块初始化函数 void initModule()。
模块名为 Extest,包含 Add 和 Sub 方法。
- #include <Python.h>
- /* C 函数 */
- double Add(double a, double b)
- {
- return a + b;
- }
- double Sub(double a, double b)
- {
- return a - b;
- }
- /* 为每个模块的每一个函数增加包装函数 */
- static PyObject * Extest_Add(PyObject *self, PyObject *args)
- {
- double a;
- double b;
- /* PyArg_ParseTuple 把 Python传过来的参数转为 C */
- if (!PyArg_ParseTuple(args, "dd", &a, &b))
- return NULL;
- /* Py_BuildValue 把 C 的数据转为 Python 的一个或一组对象,然后返回 */
- return (PyObject *)Py_BuildValue("d", Add(a, b));
- }
- static PyObject * Extest_Sub(PyObject *self, PyObject *args)
- {
- double a;
- double b;
- if (!PyArg_ParseTuple(args, "dd", &a, &b))
- return NULL;
- return (PyObject *)Py_BuildValue("d", Sub(a, b));
- }
- /* 为每个模块增加一个PyMethodDef数组 */
- static PyMethodDef ExtestMethods[] = {
- { "Add", Extest_Add, METH_VARARGS },
- { "Sub", Extest_Sub, METH_VARARGS },
- {NULL, NULL}
- };
- /* 增加模块初始化函数 void initModule() */
- void initExtest()
- {
- Py_InitModule("Extest", ExtestMethods);
- }
复制代码
2. 编译
2.1 创建setup.py- #!/usr/bin/env python
- from distutils.core import setup, Extension
- MOD = 'Extest'
- setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest.c'])])
复制代码
2.2 通过运行 setup.py 来编译和链接代码编译
安装模块
- $ python setup.py install
复制代码
2.3 导入并执行- >>> import Extest
- >>> Extest.Add(4,5)
- 9.0
- >>> Extest.Sub(5,4)
- 1.0
- >>>
复制代码
PS:Windows 编译出错如果出现
- F:\01_Code\01_Python\Python_C\Python_C>python setup.py build
- running build
- running build_ext
- building 'Extest' extension
- error: Unable to find vcvarsall.bat
复制代码
如果为 Python2.7,并且安装了VS2010,则可以通过在环境变量中添加:
变量名:VS90COMNTOOLS
变量值:%VS100COMNTOOLS%
PPS:Linux 缺少头文件
如果缺少头文件,需要安装 python-dev
- sudo apt-get install python-dev
复制代码
作者: Miss_love 时间: 2021-1-5 16:59
支持分享
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) |
Powered by Discuz! X3.2 |