Python 调用C函数比较简单
这里两个例子,一个是直接调用参数,另外一个是调用结构体
C代码python
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代码c++
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)
结果windows
3 6 30 hello world
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代码ui
#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; }
结果code
py_print res 15