我需要SWIG的帮助。
我有一个C++纯虚函数,我需要在Python中实现它,它得到一个std:span<uint8_t>作为输出参数。
virtual void fill_buffer(size_t offset, std::span<uint8_t> buffer) = 0;
python端负责用数据填充缓冲区。到目前为止,我所做的是创建一些实用函数,如:
%inline %{
PyObject* size(const std::span<uint8_t>& span) {
return PyInt_FromLong(span.size());
}
void fill_buffer(const std::span<uint8_t>& span, const std::vector<uint8_t>& buffer) {
std::copy(buffer.begin(), buffer.end(), span.data());
}
%}
然后在Python这边我有:
def fill_buffer(self, offset, buffer):
buffer_size = size(buffer)
with open(self.resource_file, 'rb') as file:
file.seek(offset)
read_bytes = file.read(buffer_size)
fill_buffer(buffer, read_bytes)
但是我想一定有更好的方法来做到这一点。也许使用类型Map?我想无缝地使用python中的buffer对象,而不需要辅助函数,也许类似于:
def fill_buffer(self, offset, buffer):
with open(self.resource_file, 'rb') as file:
file.seek(offset)
buffer = file.read(buffer.size())
1条答案
按热度按时间zf9nrax11#
鉴于以下情况,完成测试:
我们的目标是将其很好地 Package 到Python中,以便下面的示例可以工作:
(Note
readinto
是从文件读取直接进入您选择的缓冲区的简洁方法)我们需要的是一个“directorin”类型Map,幸运的是,Python 3的C API有一个函数,它几乎完全符合我们的要求。
PyMemoryView_FromMemory
创建了一个buffer对象,这是Python中std::span
的一个相当好的等价物。如果span中的类型不仅仅是
uint8_t
,我们可以做一些更有想象力的事情,但是对于这种情况,简单的接口就足够了。(另外,因为我们创建的缓冲区允许就地修改,所以不需要“directorargout”类型Map,但是“in”类型Map在这里可能是一个有用的补充)