c/c++再学习:C与Python相互调用

本文介绍了如何使用Python通过ctypes库调用C语言编写的函数,包括基本类型的运算和结构体的处理,并展示了如何从C语言环境中调用Python函数,实现了两种语言之间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c/c++再学习:Python调用C函数

Python 调用C函数比较简单
这里两个例子,一个是直接调用参数,另一个是调用结构体
C代码

typedef struct {
    int i1;
    int i2;
    char str[20];
} core_data_t;

__declspec(dllexport) int add(int a, int b)
{
    return a + b;
}

__declspec(dllexport) int multi(int a, int b)
{
    return a * b;
}

__declspec(dllexport) int struct_add(core_data_t* data)
{
    printf("%s\n", data->str);
    return data->i1 + data->i2;
}

python代码

from ctypes import *

core = CDLL('core.dll')

add_val = core.add(1, 2)
multi_val = core.multi(2, 3)

print(add_val)
print(multi_val)

class CoreData(Structure):
    _fields_ = [("i1", c_int),
                ("i2", c_int),
                ("str", c_char*20)]

coredata = CoreData()
coredata.i1 = 10
coredata.i2 = 20
coredata.str = b"hello world"
coredata_ptr = byref(coredata)
struct_add_val = core.struct_add(coredata_ptr)

print(struct_add_val)

结果

3
6
30
hello world

C调用python函数

c调用python,需要在增加<Python.h>和python36.lib,有时遇到编译时需要python36_d.lib时,只需要将python36.lib复制重命名为python36_d.lib放在同目录下即可

python代码

def py_print():
    print("py_print")

def py_add(a,b):
    return a+b

c代码

#include "stdio.h"
#include "windows.h"
#include <Python.h>   

void main()
{
    Py_Initialize();                  
    PyObject* pModule = NULL;        
    PyObject* pFunc = NULL;        
    PyObject* pArgs = NULL;
    PyObject* pValue = NULL;

    pModule = PyImport_ImportModule("python_demo");          
    pFunc = PyObject_GetAttrString(pModule, "py_print");   
    PyEval_CallObject(pFunc, NULL);   

    pFunc = PyObject_GetAttrString(pModule, "py_add");
    pArgs = PyTuple_New(2);

    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 10));

    pValue = PyEval_CallObject(pFunc, pArgs);
    int res = 0;
    PyArg_Parse(pValue, "i", &res);
    printf("res %d\n", res);

    Py_Finalize();   
    return;
}

结果

py_print
res 15

转载于:https://www.cnblogs.com/langzou/p/8982426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值