作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 Pybin11
嵌入 python 解释器的 C++ DLL。项目的 Python 端接受回调并将一些参数传递给它们。然后在 C++/C/C# 等部分执行回调。在 C++ 方面,我可以自由使用 pybind11::object
可以处理复杂类型,例如 OpenCV 图像(例如使用 py::array_t
);然而,当涉及到将它暴露给 C,然后将其用于包括 C# 在内的各种语言时,我失败了。
我失败的原因是我不能简单地将 py::object
转换为 C 可以理解的类型,反之亦然。例如,我不能简单地更改我的 C++ 回调:
typedef void(*CallbackFn)(bool, std::string, py::array_t<uint8_t>&);
void default_callback(bool status, std::string id, py::array_t<uint8_t>& img)
{
auto rows = img.shape(0);
auto cols = img.shape(1);
auto type = CV_8UC3;
cv::Mat img1(rows, cols, type, img.mutable_data());
...
}
与其 C 兼容的变体:
typedef void(*CallbackFn)(bool, char*, void*);
void default_callback(bool status, char* id, void* img)
{
//cast the void* into something useful
...
}
这只会在 Python 端导致异常,简单地说,
TypeError: (): incompatible function arguments. The following argument types are supported:
1. (arg0: bool, arg1: str, arg2: capsule) -> None
Invoked with: True, '5', array([[[195, 216, 239],
[194, 215, 237],
[193, 214, 236],
...,
[ 98, 108, 143],
[100, 110, 147],
[101, 111, 149]]], dtype=uint8)
使用其他对象(例如在 opencv img.data
上我得到这样的错误:
TypeError: (): incompatible function arguments. The following argument types are supported:
1. (arg0: bool, arg1: str, arg2: capsule) -> None
Invoked with: True, '5', <memory at 0x0000021BC3433D68>
所以我的问题是,我应该如何处理这个问题,以免在 Python 部分出现异常?如何访问 Python 中的对象指针?有可能吗?
最佳答案
这似乎是一个 Pybind11
错误并且在 Pybind11 上创建问题没有帮助,所以我最终使用了委托(delegate)回调。那就是使用中间回调在两种格式之间进行转换。我在我的 previous (related) question 中对此进行了详细解释。 .
关于python - 如何在 C 回调中使用 Pybind11 访问 Python 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61156126/
我是一名优秀的程序员,十分优秀!