使用swig包装读/写功能

时间:2014-06-08 04:42:25

标签: python c++ arrays swig

这个问题是关于使用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(),但是使用timeout参数,它们返回传输的实际字节数。

我正在寻找"正确"我应该提供的python API。我也是一个python Noob ..所以如果我在做python的错误,请纠正我。

我想我可以想出WRITE方面......

Python WRITE:Python函数应该有2个参数:一个字节数组和一个超时值。由于Python数组包含它们的长度......因此长度是一个隐含的参数。

WRITE的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文档没有帮助(原因:有很多' snippits'代码,我找不到完整的端到端连贯示例)

有人可以创造一个更好(连贯)的例子吗?或者给我一个例子来阅读?

2 个答案:

答案 0 :(得分:1)

我知道有两种方法可以做到这一点:

1:你可以让程序将它的标准io流重定向到文件,然后你的python(或任何程序)程序只需写入输入文件即可输入,并从输出文件中读取以获取输出

2:您可以使用argv和argc调用这些函数。虽然输出不能(除非你从外部源重定向程序的输出)检索程序的输出,它允许你输入输入。

我还没有重定向流(但是),但我认为它就像打开一些文件流一样简单,将以前的iostream存储在新流中,并设置std :: cout和std :: cin to(std :: istream)或std :: ifstream或std :: ofstream的(std :: ostream)强制转换。如果不是,那么你必须做一些研究。

答案 1 :(得分:1)

您的案例已由SWIG类型图库涵盖。这意味着您应该能够使用%apply (Type* INPUT, size_t length)指令,如SWIG文档中的几个地方所述,例如section 8.3。由于您没有在问题中显示任何代码,我建议您试一试,如果您遇到任何问题,请更新您的问题以显示您尝试过的代码以及会发生什么,我或其他人可能会提供一个更详细的答案。