Pybind11: внешний тип в качестве возвращаемого значения - PullRequest
0 голосов
/ 06 ноября 2019

В pybind11 мне нужно связать функцию, которая возвращает тип объекта, привязка которого уже доступна из другого модуля расширения (также созданного с помощью pybind11). Я знаю, что это, как правило, возможно, поскольку в документах написано так , и мне также удалось создать полный пример игрушки, где все работает отлично . Однако по какой-то причине я не понимаю, я не могу заставить его работать, если внешний тип имеет тип Tensor из https://github.com/deephealthproject/pyeddl. Я знаю, что -fvisibility=hidden не проблема, потому что:

  • он также присутствует в примере с игрушкой;
  • Я также пытался перестроить pyeddl без него.

src/dummy_bindings.cpp:

#include <pybind11/pybind11.h>
#include <eddl/tensor/tensor.h>

Tensor* mkTensor() {
    return new Tensor();
}

PYBIND11_MODULE(_foo, m) {
    m.def("mkTensor", &mkTensor);
}

setup.py:

from distutils.core import setup, Extension
import pybind11

ext = Extension(
    "_foo",
    sources=["src/dummy_bindings.cpp"],
    include_dirs=[
        "src",
        pybind11.get_include(),
        pybind11.get_include(user=True)
    ],
    libraries=["eddl"],
)

setup(
    name="foo",
    ext_modules=[ext]
)

Тестовый код Python:

import pyeddl._core
import _foo

print(pyeddl._core.Tensor)
t = _foo.mkTensor()

Это приводит к:

<class 'pyeddl._core.Tensor'>
Traceback (most recent call last):
  File "foo.py", line 5, in <module>
    t = _foo.mkTensor()
TypeError: Unable to convert function return value to a Python type! The signature was
    () -> Tensor

Насколько я понимаю, import pyeddl._core должен сделатьTensor введите видимый во время выполнения и сделайте вызов mkTensor работать. По крайней мере, это работает в игрушечном примере. Однако я получаю вышеуказанную ошибку. Я также являюсь автором привязок pyeddl, поэтому мне интересно, делаю ли я там что-то не так, что препятствует тому, чтобы тип был обнаружен другими расширениями. Или, возможно, есть еще кое-что о том, как pybind11 решает, можно ли преобразовать значение в тип Python, что я не понимаю.

1 Ответ

0 голосов
/ 07 ноября 2019

Причина, по которой это не сработало, состоит в том, что два расширения были скомпилированы с различными версиями gcc . К сожалению, эта возможная ловушка в настоящее время не упоминается в https://pybind11.readthedocs.io/en/stable/advanced/misc.html#partitioning-code-over-multiple-extension-modules.. Я оставлю здесь вопрос и ответ на этот вопрос, поскольку это может помочь кому-то с такой же проблемой.

...