获取Python字节字符串或缓冲区的数据指针

获取Python字节字符串或缓冲区的数据指针,python,ctypes,bytebuffer,Python,Ctypes,Bytebuffer,我需要获取Python字节字符串或缓冲区的数据指针(即第一个数据字节的内存偏移量)。我用ctypes解决了这个问题: 导入ctypes def获取数据ofs(buf): 导入ctypes data=ctypes.c_char_p() ctypes.pythonapi.PyObject\u AsCharBuffer(ctypes.py\u对象(buf),ctypes.pointer(数据), 指针(ctypes.c\u size\u t()) 返回ctypes.cast(数据,ctypes.c\u

我需要获取Python字节字符串或缓冲区的数据指针(即第一个数据字节的内存偏移量)。我用ctypes解决了这个问题:

导入ctypes
def获取数据ofs(buf):
导入ctypes
data=ctypes.c_char_p()
ctypes.pythonapi.PyObject\u AsCharBuffer(ctypes.py\u对象(buf),ctypes.pointer(数据),
指针(ctypes.c\u size\u t())
返回ctypes.cast(数据,ctypes.c\u void\u p).value
x=‘你好’
如果类型(zip())不是list:#Python 3。
def缓冲区,开始=0:
返回内存视图[开始:]
x=字节(x,‘utf-8’)
#接下来的3行必须打印相同的整数。
打印(ctypes.memmove(x,x,0)+1)
打印(获取数据(x)+1)
打印(获取数据(缓冲区(x,1)))
我已经验证了我的解决方案(
get_data_of s
)在Python2和3中工作


有没有不使用ctypes或更简单的解决方案?

如果您使用
id()
,您将没有指针,而是对象的内存位置@乔娜:事实上,
id(x)
并不能解决我的问题。我怀疑你能用普通的Python来解决这个问题。这些是实现细节(可能会改变),最终用户根本不需要知道。我想知道你为什么需要它。还要注意的是,在构造某些CTypes对象(使用Python对象)时,内存正在被复制(不是共享的,因此地址可能绑定到特定的CTypes类型实例)。@CristiFati:我发布的代码中没有复制/共享问题,您可以通过运行它来查看它。当然,返回的指针只有在支持字符串对象(
x
)存在时才有效,但对于所有可能的解决方案都是如此。我同意大多数Python代码不需要这个数据指针,但是一些与C代码接口的Python代码需要,例如,ctypes用于加载用C编写的代码,C代码需要const char*,Python代码只有一个缓冲区(因为调用方传递的是缓冲区而不是字节),将缓冲区复制到字节会太慢。@MarkTolonen:不,这不是XY问题,我确实需要数据指针。在我之前的评论中,我已经提供了一个典型的用例。