python调用c/c++

a.使用python调用c/c++的原因有: 

  1.性能瓶颈的效率提升  

  2.保持源代码的私密性,如加解密算法
b.调用的流程:(此处使用的开发环境是ubuntu14+自带的python2.7+ipython
  1.创建c/c++功能代码
  2.python类型适配,包装c/c++代码

c.mkdir新建一个单独的目录callC,使用vim新建fac.c文件增加如下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int fac(int n)
{
   if(n<2)
       return 1;
   return n*fac(n-1);
}

char *reverse(char *s)
{
  char t,*p=s,*q=(s+(strlen(s)-1));
  while(s && (p<q))
  {
   t=*p;
   *p++=*q;
   *q--=t;
  }
  return s;
}

int test(void)
{
  char s[1024];
  printf("4!==%d\n",fac(4));
  printf("8!==%d\n",fac(8));

  strcpy(s,"mynameid kkk");
  printf("reversing,get '%s'\n",reverse(s));
  return 0;
}

d.编译gcc fac.c -o fac,并执行./fac,确保fac.c文件无错误后,新建facHead.h文件,用于包含fac.c中的函数方法

#ifndef KKK_H_
#define KKK_H_

int fac(int n);
char *reverse(char *s);
int test(void);

#endif

e.在python中还需要增加一个包裹文件,此处为kkkwrapper.c

#include "Python.h"
#include <stdlib.h>
#include <string.h>
#include "facHead.h"

//需转换成python能识别的对象PyObject * ,i代表int类型
static PyObject *kkk_fac(PyObject *self,PyObject *args)
{
  int num;
  if(!PyArg_ParseTuple(args,"i",&num))
      return NULL;
  return (PyObject *)Py_BuildValue("i",fac(num));
}

static PyObject *kkk_rever(PyObject *self,PyObject *args)
{
  char *src;
  char *mstr;
  PyObject *retVal;

  if(!PyArg_ParseTuple(args,"s",&src))
      return NULL;

  mstr=malloc(strlen(src)+1);
  strcpy(mstr,src);
  reverse(mstr);
  retVal=(PyObject *)Py_BuildValue("ss",src,mstr);
  free(mstr);

  return retVal;
}

static PyObject *kkk_test(PyObject *self,PyObject *args)
{
  test();
  return (PyObject *)Py_BuildValue("");
}

static PyMethodDef kkkMethods[]=
{
  {"fac",kkk_fac,METH_VARARGS},
  {"rever",kkk_rever,METH_VARARGS},
  {"test",kkk_test,METH_VARARGS},
  {NULL,NULL},
};

//初始化操作
void initkkk(void)
{
  Py_InitModule("kkk",kkkMethods);
}

f.编写setup.py将需要封装成so的文件引入到一起

#! /usr/bin/env python
from distutils.core import setup,Extension
MOD="kkk"
setup(name=MOD,ext_modules=[Extension(MOD,sources=['fac.c','kkkwrapper.c'])])

h.最后使用sudo python setup.py install编译成kkk.so文件,出现如下信息,标识编译成功

copying build/lib.linux-x86_64-2.7/kkk.so -> /usr/local/lib/python2.7/dist-packages

g.进入ipython,使用import kkk导入kkk.so文件(也可通过from kkk import fac进行导入函数操作),输入kkk.fac(8)进行测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值