'How to use chrono::microseconds with Pybind11?

The error boils down to this snippet.

#include <chrono>
#include <pybind11/chrono.h>
#include <pybind11/pybind11.h>

namespace chr = std::chrono;
namespace py = pybind11;

struct Time {
    chr::microseconds elapsed;

    Time(const chr::microseconds& elapsed) : elapsed(elapsed) {}
};

PYBIND11_MODULE(CppModule, m) {
    py::class_<Time>(m, "Time")
        .def(py::init<const chr::microseconds&>())
        .def("elapsed", &Time::elapsed);
}

When I try to build it, I get the following error.

'pybind11::cpp_function::cpp_function': no overloaded function takes 4 arguments

What should I do to read Time::elapsed on the Python side?



Solution 1:[1]

Method def binds functions. Methods def_readwrite and def_readonly bind fields.

Time::elapsed is a field. That's why def cannot be used.

PYBIND11_MODULE(CppModule, m) {
    py::class_<Time>(m, "Time")
        .def(py::init<const chr::microseconds&>())
        .def_readwrite("elapsed", &Time::elapsed);
}

Note that on Python side type chr::microseconds is converted to datetime.timedelta. To get the total number of microseconds divide it by 1 microsecond.

import CppModule as m
import datetime

t = m.Time(datetime.timedelta(minutes=10, seconds=5))
print(t.elapsed)
print(t.elapsed // datetime.timedelta(microseconds=1))

Output.

0:10:05
605000000

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 sanitizedUser