Linux c 与 python的互操作

1.最简单的调用方式:

int alc_FFT_of(const char *topic_fmt, int ch, cJSON *result)
{
    //Py_Initialize();

    pthread_mutex_lock(&mqtt_mutex);
    // 调用 Python 函数
    PyRun_SimpleString("print('Hello, World!')");
    pthread_mutex_unlock(&mqtt_mutex);
    
    //Py_Finalize();
    return 0;
}

注意,上面的是最简单的单向执行代码。代码如果涉及多线程执行,可以使用全局mutex来进行同步。

2.数据传递

2.1 方法一,文本模式,通过字典对象:

//在Python解释器中获取脚本的主模块和全局字典:
PyObject *pModule = NULL;
PyObject *pDict = NULL;

pModule = PyImport_AddModule("__main__");
pDict = PyModule_GetDict(pModule);
//使用PyRun_String函数来执行Python代码,并传递参数给脚本。可以使用PyEval_GetGlobals()函数获取脚本执行的全局字典,在这个字典中你可以定义脚本中可用的变量或者函数。
PyObject *pResult = NULL;
const char *script = "print('Hello, ' + name)";

PyObject *pGlobals = PyEval_GetGlobals();
PyDict_SetItemString(pGlobals, "name", PyUnicode_FromString("John"));

pResult = PyRun_String(script, Py_file_input, pDict, pGlobals);
//在上述例子中,我们将name变量传递给Python脚本。你可以根据需要传递更多的参数,只需在全局字典中设置相应的变量即可。

//在获取结果之后,你可以根据需要处理脚本的输出或返回值(如果有的话):
if (pResult != NULL) {
    if (PyErr_Occurred()) {
        PyErr_Print();
    }
    Py_DECREF(pResult);
}
//最后,不要忘记在完成后清理和关闭Python解释器:
Py_Finalize();

 2.2 方法二,涉及大量二进制数据的传递:

Python的C API提供了将二进制数据传递给Python脚本的方式。你可以使用PyBytes_FromStringAndSize函数将C/C++中的二进制数据转换为Python的bytes对象,并将其传递给脚本。

//2进制模式传递参数的python-c互操作示例:

#include 

int main(int argc, char *argv[]) {
    Py_Initialize();
    
    // 创建二进制数据
    unsigned char binaryData[] = {0x01, 0x02, 0x03, 0x04, 0x05};
    size_t binarySize = sizeof(binaryData);
    
    // 将二进制数据转换为Python的bytes对象
    PyObject *pBytes = PyBytes_FromStringAndSize((const char *)binaryData, binarySize);
    
    // 将bytes对象传递给脚本
    PyObject *pModule = PyImport_AddModule("__main__");
    PyObject *pDict = PyModule_GetDict(pModule);
    PyDict_SetItemString(pDict, "binary_data", pBytes);
    
    // 执行脚本
    const char *script = "print(binary_data)";
    PyRun_String(script, Py_file_input, pDict, pDict);
    
    // 释放Python对象
    Py_XDECREF(pBytes);
    
    Py_Finalize();
    return 0;
}

附录A C与Python互操作需要的软件包

# python
yum install python3-devel

#互操作可能涉及到的cJSON
#需要下载cJSON-master源码:
cd /workerspace/sensor/src/data_dispatch/3rd/cJSON-master
make clean
make
make install
sudo ln -s /usr/local/lib/libcjson.so.1 /usr/lib/libcjson.so.1
sudo ldconfig 

#gcc
yum install gcc-c++ cmake openssl-devel -y

#也许你会用到mqtt
#mosquitto这个也要下载源码包,包含服务器,但是可以不运行。
make clean
make
make install
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
sudo ldconfig 

#uuid.
yum install uuid-devel
yum install libuuid-devel

你可能感兴趣的:(Python,单片机,嵌入式系统设计,centos,python,linux)