使用 swig 包装类似读/写的函数
Posted
技术标签:
【中文标题】使用 swig 包装类似读/写的函数【英文标题】:using swig to wrap read/write like functions 【发布时间】:2014-06-08 04:42:24 【问题描述】:这个问题是关于使用 SWIG 创建 Python/C++ 接口的。
我的 C++ 代码有一些模拟经典 unix 读/写的函数,我需要从 Python 调用这些函数。 C++类是这样的:
class DEVICE
... other stuff ...
int write_bytes( const uint8_t *bytes, size_t nbytes, unsigned timeout_msecs );
int read_bytes( uint8_t *bytes, size_t nbytes, unsigned timeout_msecs );
这些函数完全模拟了 unix read() 和 write(),但带有超时参数,它们返回实际传输的字节数。
我正在寻找我应该提供的“正确”python API。我也是一个python Noob ..所以如果我对python做错了,请纠正我。
我想我可以弄清楚 WRITE 方面..
Python WRITE:Python 函数应该有 2 个参数:一个字节数组和一个超时值。由于 Python 数组包含它们的长度……因此长度是一个隐含的参数。
用于写入的 C++ 代码:由于内存来自 python,我只需要询问数组它包含多少字节,获取原始字节指针,然后以某种方式调用我的 C 函数。
READ 方面...我需要帮助。
Python READ:同样,2 个参数,一个字节数组和一个超时值。在这里,由于我不知道将要读取的实际字节数 - 我认为我的 C 代码应该代表 Python 分配内存(或者这是错误的吗?我不知道)。然后 - 我如何设置结果长度?我没有看到/找到一个例子。还是让我的用户/受害者预先分配数组? (这似乎是错误的)
我查看了 LLDB 代码中的示例,特别是 - 我看到了这些 %typemaps - 具体来说:
https://github.com/carlokok/lldb/blob/master/scripts/Python/python-typemaps.swig#L134
我不完全理解类型映射(我也是 swig 的新手...),但它们似乎非常接近。但不完全是我想要的。有人可以解释这些是如何工作的吗? SWIG 文档没有帮助(原因:有很多“代码片段”,我找不到完整的端到端连贯示例)
有人可以创建一个更好(连贯)的例子吗?或者给我一个例子来阅读?
【问题讨论】:
【参考方案1】:据我所知,有两种方法可以做到这一点:
1:您可以让程序将其标准 io 流重定向到文件,然后您的 python(或任何程序)程序可以只写入输入文件以进行输入,并从输出文件中读取以获取输出。
2:可以通过argv和argc调用函数。虽然输出不能(除非您从外部源重定向程序的输出)检索程序的输出,但它允许您输入输入。
我还没有搞乱重定向流(还),但我认为它就像打开一些文件流、将以前的 iostream 存储在新流中并将 std::cout 和 std::cin 设置为 (std ::istream) 或 (std::ostream) 转换为 std::ifstream 或 std::ofstream。如果不是,那么您将不得不做一些研究。
【讨论】:
不 - 这里没有流。也许你误解了,因为我以 unix 读/写函数为例。我正在使用的 C/C++ 函数用于处理通信协议。正在读取/写入的数据是数据包的有效负载部分。【参考方案2】:您的案例已包含在 SWIG 类型映射库中。这意味着您应该能够使用 %apply (Type* INPUT, size_t length)
指令,如 SWIG 文档中的几个地方所述,例如 section 8.3。由于您没有在问题中显示任何代码,我建议您试一试,如果您有任何问题,请更新您的问题以显示您尝试过的代码以及发生了什么,我或其他人可能能够提供更多详细解答。
【讨论】:
以上是关于使用 swig 包装类似读/写的函数的主要内容,如果未能解决你的问题,请参考以下文章
将 python 函数传递给 SWIG 包装的 C++ 代码
使用 SWIG 包装对象从 C++ 调用 Python 函数的最简洁方法是啥