python之C扩展二

1.c代码

/*************************************************************************
    > File Name: python_test.c
    > Author: 
    > Mail: 
    > Created Time: Thu 03 Dec 2015 10:45:04 PM PST
 ************************************************************************/
#include <python2.7/Python.h> //包含python的头文件  
/*1 c/cpp中的函数  */
int my_c_function(const char *arg) {  
    int n = system(arg);  
    return n;  
}  
// 2 python 包装  
static PyObject * wrap_my_c_fun(PyObject *self, PyObject *args) {  
    const char * command;  
    int n;  
    if (!PyArg_ParseTuple(args, "s",&command))//这句是把python的变量args转换成c的变量command  
    return NULL;  
    n = my_c_function(command);//调用c的函数  
      return Py_BuildValue("i",n);//把c的返回值n转换成python的对象  
}  
// 3 方法列表  
static PyMethodDef MyCppMethods[] = {  
//MyCppFun1是python中注册的函数名,wrap_my_c_fun是函数指针  
    { "MyCppFun1", wrap_my_c_fun, METH_VARARGS, "Execute a shellcommand."  },  
    { NULL, NULL, 0, NULL  }  
};  
// 4 模块初始化方法  
PyMODINIT_FUNC initMyCppModule(void) {  
        //初始模块,把MyCppMethods初始到MyCppModule中  
    PyObject *m = Py_InitModule("MyCppModule", MyCppMethods);  
    if (m == NULL)  
        return;  
}  

2.python代码 setup.py

#!/usr/bin env python

from distutils.core import setup, Extension

MOD = 'MyCppModule'

setup(name=MOD,version = '1.0', ext_modules=[Extension(MOD,sources=['python_test.c'])])

3.编译

kjlr@kjlr-virtual-machine:~/python_test$ python setup.py build
running build
running build_ext
building 'MyCppModule' extension
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c python_test.c -o build/temp.linux-x86_64-2.7/python_test.o
creating build/lib.linux-x86_64-2.7
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/python_test.o -o build/lib.linux-x86_64-2.7/MyCppModule.so

4.连接至python

kjlr@kjlr-virtual-machine:~/python_test$ sudo python 
setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.linux-x86_64-2.7/MyCppModule.so -> /usr/local/lib/python2.7/dist-packages
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/MyCppModule-1.0.egg-info

5.测试代码 test1.py

#!/usr/bin/env python

import MyCppModule
a = "ls"
MyCppModule.MyCppFun1(a)
测试结果(python运行ls命令):
kjlr@kjlr-virtual-machine:~/python_test$ python test1.py 

 build   python_test.c  setup.py    test1.py  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值