В 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, что я не понимаю.