pybind / pybind11

Seamless operability between C++11 and Python
https://pybind11.readthedocs.io/
Other
15.39k stars 2.07k forks source link

C++ generates data in real time, how to receive data in real time through pybind11 in python? #4740

Open GalSang17 opened 1 year ago

GalSang17 commented 1 year ago

Required prerequisites

What version (or hash if on master) of pybind11 are you using?

2.11.0dev1

Problem description

I am now using the deep learning framework to generate some target object detection box boxes and other information, and then I want to use pybind11 to encapsulate this information for my python function to use. It should be noted that the information of these box boxes is updated and changed in real time Yes, how should I get the data passed through pybind11 in the python function, and these data also change together. At present, the way I try to get all the empty values, I am a novice in C++, all now It's hard to keep going, hope you can help, thanks

my envs: ubuntu18.04 python3.8.10 gcc 7.5.0

Reproducible example code

my codes:
#include <pybind11/pybind11.h>
#include <pybind11/embed.h>
#include <pybind11/stl.h>
#include <nlohmann/json.hpp>
#include <mutex>

namespace py = pybind11;

void initializeInterpreter() {
    py::initialize_interpreter();
}

static std::once_flag initFlag;
static py::dict py_json;

py::dict get_data() {
    return py_json;
}

void convert_json_cxx_2_py(const nlohmann::json& json_data) {
    std::call_once(initFlag, initializeInterpreter);
    py::gil_scoped_acquire acquire;
    py_json = py::module::import("json").attr("loads")(json_data.dump());
    get_data();
    py::gil_scoped_release release;
}

PYBIND11_MODULE(cxx_json_2_py, m) {
    m.def("convert_json_cxx_2_py", &convert_json_cxx_2_py, "Convert nlohmann::json to Python JSON");
    m.def("get_data", &get_data, "Get data converted from nlohmann::json to Python JSON", py::return_value_policy::reference);
    m.attr("py_json") = py::cast(&py_json);
}

function call location:
nlohmann::json jsondata = helmet_alarm(img, res, rtsp, 10, "no-helmet");

if (!jsondata.empty()) {
    convert_json_cxx_2_py(jsondata);
}
And the function input parameters nlohmann::json jsondat here are changed in real time

the python scipt:
import cxx_json_2_py

r = cxx_json_2_py.py_json
# r = cxx_json_2_py.get_data() or
print('res', r)

the python function return:
res {}
core dumped

Is this a regression? Put the last known working version here if it is.

No response