zoukankan      html  css  js  c++  java
  • python与c语言交互应用实例

    1、python向c语言写数据

    1) 先将接收端编译成一个共享链接库
    gcc/arm-linux-gnueabihf-gcc -o bluetooth_proxy.so -shared -fPIC bluetooth_proxy.c

    bluetooth_proxy.c

    #include <stdio.h>
    
    struct bluetooth_t{    
        int status;
        char buf[128];
    };
    
    int bluetooth_proxy_cb(struct bluetooth_t bluetooth)
    {
            printf("bluetooth status:%d, buf:%s 
    ", bluetooth.status, bluetooth.buf);
    
            return 0;
    }

    2)运行发送端python脚本即可将python数据发送到c语言接口函数。

    bt_msg_send_simple.py

    #!/usr/bin/python
    import ctypes
    from ctypes import *
    
    class bluetooth(Structure):
            _fields_=[('status',c_int),('buf',c_char * 128)]
    
    if __name__ == "__main__":
    
        func = ctypes.cdll.LoadLibrary("./bluetooth_proxy.so")
        func.bluetooth_proxy_init()
        s = bluetooth()
        s.status = 555
        s.buf = bytes('hello,world')
        func.bluetooth_proxy_cb(s)

    注意:如果python调用的函数参数仅仅是个简单的指针,可以不用映射。

    例如char *data;

    func.bluetooth_proxy_cb(data)

     2、python从c语言读取数据

    既然能调用c语言链接库函数参数来发送数据,接收数据也可以从通过c语言函数返回值传递了。

    python_data = func.bluetooth_proxy_cb(var)

     

    3、python的c语言拓展

    用c语言写好so,然后 import xxxx 来无缝结合

    test.c

    #include<Python.h>
    static PyObject *test(PyObject *self, PyObject *args){
        int arg1, arg2;
        if(!(PyArg_ParseTuple(args, "ii", &arg1, &arg2))){
            return NULL;
        }
        return Py_BuildValue("i",  arg1 + arg2 * 10);
    }
    
    static PyMethodDef  testMethods[] = {
        {"test", test, METH_VARARGS, "This is test"},
        {NULL, NULL}
    };
    
    PyMODINIT_FUNC inittest(){
        Py_InitModule("test", testMethods);
    }

    gcc -I /usr/include/python2.7/ -fpic --shared -o test.so test.c

    test.py

    import test
    print test.test(1, 2)   # 输出 21


    demo在github上

    https://github.com/zhoudd1/python_call_c

     

    python和C语言混编的几种方式

    http://www.cnblogs.com/Colin-Cai/p/7594551.html

  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/dong1/p/8868334.html
Copyright © 2011-2022 走看看