从C访问PyBuffer内容

2 投票
2 回答
1591 浏览
提问于 2025-04-15 18:24

我在Python中创建了一个缓冲区对象,代码如下:

f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))

现在我通过SWIG把byte_stream作为参数传递给一个C语言的函数。我有一个类型映射,用于转换数据,内容如下:

%typemap(in) unsigned char * byte_stream {
    PyObject *buf = $input;
    //some code to read the contents of buf
}

我尝试了几种不同的方法,但就是无法获取到byte_stream的实际内容或值。我该如何使用C语言的API来转换或访问byte_stream的内容呢?虽然有很多方法可以把C语言的数据转换成缓冲区,但我找不到把缓冲区转换回C数据的方法。

我试着在gcb中查看这个对象,但它和它指向的值都没有我的数据。

(我使用缓冲区是因为我想避免在从文件读取数据时将数据转换成字符串的开销)我在Linux上使用的是Python 2.6。

-- 谢谢,Pavel

2 个回答

1

一旦你在文件对象上使用了 read 方法,数据就会被转换成一个 str 对象;而调用 buffer 方法并不会把它转换成任何类型的流。如果你想避免创建字符串对象带来的额外开销,你可以直接把文件对象传给你的 C 代码,然后通过 它的 C API 来使用。

2

我在使用缓冲区,因为我想避免在从文件读取数据时将数据转换成字符串的开销。

其实你并没有避免什么。调用read()方法时,字符串已经被创建了。调用buffer()只是又创建了一个新的缓冲区对象,这个对象指向了那个字符串。

如果你想访问缓冲区对象指向的内存,可以试试PyObject_AsReadBuffer()。更多信息可以查看这个链接:http://docs.python.org/c-api/objbuffer.html

撰写回答