Оболочка указателя файла Pybind11 для _IO_FILE - PullRequest
1 голос
/ 31 мая 2019

Я пишу привязку Python для класса C ++, который принимает указатель файла -

  PYBIND11_MODULE(pywrapper, m) { 
...
 py::class_<Dog, Animal>(m, "Dog")
        .def(py::init<FILE * const>());

}

Я вызываю функцию c ++ следующим образом -

f = open("test.log","w")

c = Dog(f)

Я получаю сообщение об ошибке -

File "main.py", line 6, in test_init
    client = Dog(f)
TypeError: __init__(): incompatible constructor arguments. The following argument types are supported:
    1. pywrapper.Dog(arg0: _IO_FILE)

Invoked with: <_io.TextIOWrapper name='test.log' mode='w' encoding='UTF-8'>

Как мне написать обертку для конструктора здесь?

1 Ответ

1 голос
/ 03 июня 2019

Я полагаю, что входные буферы не реализованы в pybind11. Вот реализация вывода буфера https://github.com/pybind/pybind11/blob/master/include/pybind11/iostream.h#L24

Вот пример использования буфера в качестве output stream:

.def("read_from_file_like_object",
   [](MyClass&, py::object fileHandle) {

     if (!(py::hasattr(fileHandle,"write") &&
         py::hasattr(fileHandle,"flush") )){
       throw py::type_error("MyClass::read_from_file_like_object(file): incompatible function argument:  `file` must be a file-like object, but `"
                                +(std::string)(py::repr(fileHandle))+"` provided"
       );
     }
     py::detail::pythonbuf buf(fileHandle);
     std::ostream stream(&buf);
     //... use the stream 

   },
   py::arg("buf")
)
...