IE盒子

搜索
查看: 127|回复: 1

C语言调用Python库

[复制链接]

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-12-9 20:37:29 | 显示全部楼层 |阅读模式
有时候需要利用不同语言的特性共同完成一个任务,甚至一个项目。比如在目标识别中,如果用python去实现,有些步骤会比较慢,我们会将这些步骤用c语言来写,然后再用python去调用写好的c库。那有时候,也可能会用到c语言去调用python库,因为python太活跃了,工具库层数不穷,直接用python造好的轮子来高效完成任务。本文将介绍如何用c调用python
环境:centos7、python3
安装Python.h头文件,本文例子为python3.6
yum install python3-devel调用的print函数

#include <Python.h>
int main(int argc, char *argv[]) {
  Py_Initialize();
  PyRun_SimpleString("print('hello world in python and c')");
  Py_Finalize();
  return 0;
}编译
g++ call_py.c -I /usr/include/python3.6m -lpython3.6m -o call_py运行
./call_py 调用带参的内嵌函数

调用math里面的pow函数
#include <Python.h>

int main()
{
    Py_Initialize();
    if (!Py_IsInitialized())
    {
        return -1; //init python failed
    }
    PyObject *pmodule = PyImport_ImportModule("math");
    if (!pmodule)
    {
        printf("cannot find math module \n");
        return -1;
    }
    else
    {
        printf("PyImport_ImportModule success\n");
    }

    PyObject *pfunc = PyObject_GetAttrString(pmodule, "pow");
    if (!pfunc)
    {
        printf("cannot find pow\n");
        Py_XDECREF(pmodule);
        return -1;
    }
    else
    {
        printf("PyObject_GetAttrString success\n");
    }
   
    PyObject *pArgs = PyTuple_New(2);
    PyObject *pVal = Py_BuildValue("i", 3);     
    PyObject *pVal1 = Py_BuildValue("i", 5);
    PyTuple_SetItem(pArgs, 0, pVal);
    PyTuple_SetItem(pArgs, 1, pVal1);
   
    PyObject *pResult = PyObject_CallObject(pfunc, pArgs);
    int a;
    float b;
    PyArg_Parse(pResult, "i", &a);
    // PyArg_ParseTuple(pResult,"if",&a,&b);
    printf("%f\n", a);

    Py_XDECREF(pmodule);
    Py_XDECREF(pfunc);
    Py_XDECREF(pArgs);
    Py_XDECREF(pResult);

    Py_Finalize();
   
    return 0;
}编译
g++ call_py1.c -I /usr/include/python3.6m -lpython3.6m -o call_py1运行
./call_py1调用带参的自建函数脚本

python脚本: call_py.py
import logging

LOG_FORMAT = "[%(asctime)s][%(levelname)s][%(module)s.py:%(lineno)d]---> %(message)s"
DATE_FORMAT = "%Y%m%d %T"
logging.basicConfig(filename="hello.log", level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT)

ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(logging.Formatter(LOG_FORMAT,DATE_FORMAT))
logging.getLogger().addHandler(ch)


def func1(vender,dataid,tuple):
    logging.info("vender = %d, dataid = %d" % (vender,dataid))
    logging.info("type tuple = [%s] tuple = [%s]" % (str(type(tuple)), str(tuple)))
    return (15,5.6)
c代码
#include <Python.h>

int main()
{
    Py_Initialize();
    if (!Py_IsInitialized())
    {
        return -1; //init python failed
    }
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    PyObject *pmodule = PyImport_ImportModule("call_py");
    if (!pmodule)
    {
        printf("cannot find call_py.py\n");
        return -1;
    }
    else
    {
        printf("PyImport_ImportModule success\n");
    }

    PyObject *pfunc = PyObject_GetAttrString(pmodule, "func1");
    if (!pfunc)
    {
        printf("cannot find func\n");
        Py_XDECREF(pmodule);
        return -1;
    }
    else
    {
        printf("PyObject_GetAttrString success\n");
    }
   
    PyObject *pArgs = PyTuple_New(3);
    PyObject *pVender = Py_BuildValue("i", 2);     
    PyObject *pDataID = Py_BuildValue("i", 10001);
    PyObject *pyTupleList = PyTuple_New(2);        
    float arr_f[2];
    arr_f[0] = 78;
    arr_f[1] = 3.41;
    for (int i = 0; i < 2; i++)
    {
        PyTuple_SetItem(pyTupleList, i, Py_BuildValue("f", arr_f));
    }

    PyTuple_SetItem(pArgs, 0, pVender);
    PyTuple_SetItem(pArgs, 1, pDataID);
    PyTuple_SetItem(pArgs, 2, pyTupleList);
   
    PyObject *pResult = PyObject_CallObject(pfunc, pArgs);
    int a;
    float b;
    // PyArg_Parse(pResult, "i", &a);
    PyArg_ParseTuple(pResult,"if",&a,&b);
    printf("%d %f\n", a,b);

    Py_XDECREF(pmodule);
    Py_XDECREF(pfunc);
    Py_XDECREF(pArgs);
    Py_XDECREF(pResult);

    Py_Finalize();
   
    return 0;
}编译
g++ call_py2.c -I /usr/include/python3.6m -lpython3.6m -o call_py2运行
./call_py2
回复

使用道具 举报

2

主题

16

帖子

26

积分

新手上路

Rank: 1

积分
26
发表于 7 天前 | 显示全部楼层
这么强,支持楼主,佩服
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表