You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyBytes_AsStringAndSize()为何写入长度错误的字节数组?

问题:Python/C API中bytearray转char数组后长度显示异常?

我正在开展一项研究项目,需通过Python/C API从C程序调用Python函数,并将Python脚本返回的256字节bytearray传递到C程序中,打算将其存储为char数组以便后续写入文件。但使用PyBytes_AsStringAndSize()转换bytes类型PyObject时,尽管指定了256字节,却仅显示写入8字节数据。

代码片段

int len = PyBytes_Size(pValue);  //pValue是从Python函数返回的对象
printf("C:object returned. Length of pValue Object: %i\n", len);

PyObject *pBytes = PyBytes_FromObject(pValue);   
int bLen = PyBytes_Size(pBytes);               
printf("C:object converted to bytes. Length of pBytes: %i\n", bLen);        
            
Py_ssize_t size = len;
char * test;

PyBytes_AsStringAndSize(pBytes,&test,&size); //将返回的PyObject内容存储到char数组test中
printf("Length of new byte array: %lu \n", sizeof(test));

运行输出

C:object returned. Length of pValue Object: 256

C:object converted to bytes. Length of pBytes: 256

Length of new byte array: 8 

解答

问题出在sizeof(test)的用法上——你获取的是指针变量自身的大小,不是它指向的内存块的长度。在64位系统中,指针的固定大小就是8字节,所以输出永远是8,和实际数据长度无关。

正确的做法是:

  • PyBytes_AsStringAndSize()执行后,size变量已经被更新为实际的字节长度(也就是256),直接使用这个变量就能获取数据的真实长度。
  • 如果你需要将数据复制到自己管理的内存中(避免依赖Python内部内存),可以手动分配内存并拷贝:
Py_ssize_t size = PyBytes_Size(pBytes);
char *test = malloc(size);
if (test != NULL) {
    memcpy(test, PyBytes_AsString(pBytes), size);
    // 后续使用test处理数据
    free(test); // 使用完记得释放内存
}

另外注意:PyBytes_AsStringAndSize()返回的test指针指向Python内部缓冲区,不要手动释放,也不要修改这块内容(除非你明确设置了可写参数,但不推荐)。

内容的提问来源于stack exchange,提问作者Jordan Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:25:32