python安装c语言库_C语言扩展Python模块

一、

main.cpp

#include

#include "Python.h"

static PyObject* Py_Add_Formular(PyObject *self, PyObject *args)

{

PyObject *pObj = NULL;

int nThread = 0, nCalcData = -1, isDebug = 0, isCalcHis = 0;

if (!PyArg_ParseTuple(args, "Oiiii", &pObj, &nThread, &nCalcData, &isDebug, &isCalcHis)) //"Oiiii" O 代表 Object, i 代表 int

{

PyErr_Print();

return NULL;

}

return Py_True;

}

static PyMethodDef EmbMethods[]=

{

{"Add_Formular", Py_Add_Formular, METH_VARARGS, "Add formular."},

{NULL, NULL, 0, NULL}

};

int main()

{

Py_Initialize();

Py_InitModule("DJRJ", EmbMethods); //扩展 DJRJ 模块

PyObject *pModule = NULL;

PyObject *pFunc = NULL;

PyObject *pArg = NULL;

pModule = PyImport_ImportModule("Demo");

pFunc = PyObject_GetAttrString(pModule, "Start");

pArg = Py_BuildValue("(s)", "hello");

PyEval_CallObject(pFunc, pArg);

return 0;

}

Demo.py

#encoding=utf8

import DJRJ

class Test:

def __init__(self):

print "init"

def Start(self):

DJRJ.Add_Formular(self,1,500,0,1)

test = Test()

def Start(s):

print s

test.Start()

效果:

二、将模块生成lib、或直接安装到python库目录

DJRJ模块代码:

DJRJ.cpp

#include

#include "Python.h"

static PyObject* Py_Add_Formular(PyObject *self, PyObject *args)

{

PyObject *pObj = NULL;

int nThread = 0, nCalcData = -1, isDebug = 0, isCalcHis = 0;

if (!PyArg_ParseTuple(args, "Oiiii", &pObj, &nThread, &nCalcData, &isDebug, &isCalcHis))

{

PyErr_Print();

return NULL;

}

printf("%d%d%d%d\r\n", nThread, nCalcData, isDebug, isCalcHis);

return Py_True;

}

/*

PyMethodDef结构体有四个字段。

第一个是字符串,表示在Python文件中对应的方法的名称;

第二个是对应的C代码的函数名称;

第三个是一个标志位,表示该Python方法是否需要参数,METH_NOARGS表示不需要参数,METH_VARARGS表示需要参数;

第四个是一个字符串,它是该方法的__doc__属性,这个不是必须的,可以为NULL。

PyMethodDef结构体数组最后以{NULL,NULL,0,NULL}结尾。

*/

static PyMethodDef DJRJMethods[]=

{

{"Add_Formular", Py_Add_Formular, METH_VARARGS, "Add formular."},

{NULL, NULL, 0, NULL}

};

/*

这个函数是用于模块初始化的,即是在第一次使用import语句导入模块时会执行。

其函数名必须为initmodule_name这样的格式,在这里我们的模块名为DJRJ,所以函数名就是initDJRJ。

在这个函数中又调用了PyInitModule函数,它执行了模块的初始化操作。

Py_InitModule函数传入了两个参数,第一个参数为字符串,表示模块的名称;第二个参数是一个Py_MethodDef的结构体数组,表示该模块都具有哪些方法。

因此在 initDJRJ 方法之前还需要先定义 DJRJMethods 数组。

*/

PyMODINIT_FUNC initDJRJ(void)

{

Py_InitModule("DJRJ", DJRJMethods);

}

创建一个setup.py 文件,编译最主要的工作由setup()函数来完成:

from setuptools import setup,Extension

MOD = 'DJRJ'

setup(name=MOD, ext_modules=[Extension(MOD, sources=['DJRJ.cpp'])])

执行命令进行编译:

python setup.py build

如果报错,得先安装setuptools,步骤如下:

1.下载ez_setup.py到某一个目录(如: e:\tools\ez_setup.py)下载地址: https://bootstrap.pypa.io/ez_setup.py

2.cmd进入e:\tools,运行python ez_setup.py

setuptools安装完毕之后:

再执行 python setup.py build

也可以执行python setup.py install  直接安装到python库目录:

效果:

=

Demo程序:

百度云(13207134391):

CC++中调用Python\CExtenPythonModule

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值