python 调用C++函数,关于结构体传参问题

在 Python 中调用 C++ 函数,并且需要传递结构体作为参数,可以通过几种不同的方法实现。以下是详细的步骤和示例,帮助你实现结构体的传递:

方法 1: 使用 ctypes

ctypes 是 Python 的内置库,用于与 C 语言库交互。它可以用来调用 C++ 的函数,并传递结构体参数。

1. 编写 C++ 代码

首先,编写一个 C++ 库,定义结构体和函数,并编译为共享库(.so 文件或 .dll 文件)。

example.cpp

cpp
#include <iostream> extern "C" { // 定义结构体 struct Person { int age; char name[50]; }; // 函数:接受结构体作为参数 void printPerson(Person person) { std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl; } }

编译为共享库

bash
g++ -shared -o libexample.so -fPIC example.cpp

2. 在 Python 中使用 ctypes

使用 ctypes 库加载共享库并调用 C++ 函数。

example.py

python
import ctypes # 加载共享库 lib = ctypes.CDLL('./libexample.so') # 定义结构体类型 class Person(ctypes.Structure): _fields_ = [("age", ctypes.c_int), ("name", ctypes.c_char * 50)] # 设置函数参数类型 lib.printPerson.argtypes = [Person] # 创建结构体实例 person = Person(age=30, name=b'John Doe') # 调用 C++ 函数 lib.printPerson(person)

方法 2: 使用 cffi

cffi 是另一个 Python 库,允许通过 C 接口调用 C/C++ 函数。

1. 编写 C++ 代码

example.cpp (与上文相同)

2. 编译为共享库

bash
g++ -shared -o libexample.so -fPIC example.cpp

3. 在 Python 中使用 cffi

example.py

python
from cffi import FFI ffi = FFI() # 定义 C++ 结构体和函数 ffi.cdef(""" typedef struct { int age; char name[50]; } Person; void printPerson(Person person); """) # 加载共享库 lib = ffi.dlopen('./libexample.so') # 创建结构体实例 person = ffi.new("Person*") person.age = 30 ffi.memmove(person.name, b'John Doe', len(b'John Doe')) # 调用 C++ 函数 lib.printPerson(person)

方法 3: 使用 pybind11

pybind11 是一个 C++11 标准库,用于创建 Python C++ 扩展,可以更方便地处理 C++ 和 Python 之间的数据交换。

1. 编写 C++ 代码

example.cpp

cpp
#include <pybind11/pybind11.h> #include <pybind11/stl.h> struct Person { int age; std::string name; }; void printPerson(Person person) { std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl; } PYBIND11_MODULE(example, m) { pybind11::class_<Person>(m, "Person") .def(pybind11::init<>()) .def_readwrite("age", &Person::age) .def_readwrite("name", &Person::name); m.def("printPerson", &printPerson); }

2. 编译为共享库

首先安装 pybind11

bash
pip install pybind11

然后编译 C++ 代码:

bash
c++ -O3 -Wall -shared -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

3. 在 Python 中使用

example.py

python
import example # 创建结构体实例 person = example.Person() person.age = 30 person.name = 'John Doe' # 调用 C++ 函数 example.printPerson(person)

总结

  1. 使用 ctypes:加载共享库,定义结构体类型和函数参数,创建结构体实例并调用函数。
  2. 使用 cffi:通过 C 接口定义结构体和函数,创建结构体实例并调用函数。
  3. 使用 pybind11:创建 C++ 扩展模块,定义结构体和函数,编译为 Python 模块,直接在 Python 中使用。

关键字

Python, C++, 调用 C++ 函数, 结构体传参, ctypes, cffi, pybind11, 共享库, 模块编译, Python 扩展