从C访问PyBuffer的内容

时间:2010-01-24 18:30:15

标签: python swig python-c-api pybuffer

我在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
}

我尝试了一些不同的bug,无法获取我的byte_stream的实际内容/值。如何使用C API转换或访问byte_stream的内容?有许多不同的方法可以将C数据转换为缓冲区,但我没有找到相反的方法。 我曾尝试在gcb中查看此对象但不是它,或者它指向的值包含我的数据。

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

- 谢谢帕维尔

2 个答案:

答案 0 :(得分:2)

  

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

你没有避免任何事情。该字符串已由read()方法构建。调用buffer()只会构建一个指向该字符串的附加缓冲区对象。

至于获取缓冲区对象指向的内存,请尝试PyObject_AsReadBuffer()。另请参阅http://docs.python.org/c-api/objbuffer.html

答案 1 :(得分:1)

只要在文件对象上使用read方法,数据就会转换为str对象;调用buffer方法不会将其转换为任何类型的流。如果您想避免创建字符串对象的开销,您只需将文件对象传递给C代码,然后通过its C API使用它。