使用pybdN11返回C++结构到Python

2024-10-01 00:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用PybDun11调用一个简单的C++例程时遇到了问题。我有一个创建、初始化和返回结构的函数。在C++中,它工作得很好。从Python调用时,它没有正确初始化。知道怎么了吗

<> >强输出> C++(TestJord.TestLIB .CPP):>P/>
head_status.head_num =  1

Python3.7(test_testlib.py)的输出:

$ python test_pybind.py
head_num=-858993460
head_num=2

守则:

testlib.h:

#pragma once

#ifdef TESTLIB_EXPORTS
#define TESTLIB_API extern "C" __declspec(dllexport)
#else
#define TESTLIB_API extern "C" __declspec(dllimport)
#endif

struct HeadStatus {
    const int getHeadNum() { return head_num; };
    void setHeadNum(const int new_head_num) { head_num =  new_head_num; };
    int head_num;
};

TESTLIB_API HeadStatus &get_head_status();

testlib.cpp:

#include "pch.h"
#include "framework.h"
#include "testlib.h"

#include <pybind11/pybind11.h>
namespace py = pybind11;

#include <iostream>

TESTLIB_API HeadStatus &get_head_status()
{
    HeadStatus head_status = HeadStatus();
    head_status.head_num = 1;
    return head_status;
}

using namespace pybind11::literals;   // needed for _a style arguments in m.def

PYBIND11_MODULE(testlib, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    py::class_<HeadStatus>(m, "HeadStatus")
        .def("getHeadNum", &HeadStatus::getHeadNum)
        .def("setHeadNum", &HeadStatus::setHeadNum);

    m.def("get_head_status", &get_head_status, "A function that returns a struct for the status of a head");
}

test\u testlib.cpp:

#include <iostream>
#include "../testlib/testlib.h"

int main()
{
    HeadStatus hs = get_head_status();
    std::cout << "head_status.head_num =  " << hs.head_num << "\n";
}

test\u testlib.py:

import testlib

head_status = testlib.get_head_status()
head_num = head_status.getHeadNum()
print(f"head_num={head_num}")  # prints -858993460

head_status.setHeadNum(2)
head_num = head_status.getHeadNum()
print(f"head_num={head_num}")  # prints 2

Tags: pytestapigetincludestatusheadnum