本帖最后由 测试积点老人 于 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
复制代码
|