Python calls C functions
It is relatively simple to call C functions in Python.
Here are two examples, one is to directly call the parameters, and the other is to call the structured
C code
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 code
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)
result
3
6
30
hello world
C call python function
c calls python, which needs to be increased
python code
def py_print():
print("py_print")
def py_add(a,b):
return a+b
c code
#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;
}
result
py_print
res 15