gpt4 book ai didi

python - 在 C 和 Python 之间传递的 C 指针(使用胶囊)为空

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:44 24 4
gpt4 key购买 nike

我正在为我开发的一些 C 函数创建一个 python 扩展。

该代码使用了我们不需要从 Python 代码分析的复杂结构,因此我们使用指针胶囊将结构从一个函数传递到另一个函数。

这是我在 C 中创建的 python 扩展的简化(这里我只使用 double 而不是我们的结构):

#include "Python.h"

static PyObject *example2 (PyObject *dummy, PyObject *args)
{
PyObject *pymodel=NULL;

if (!PyArg_ParseTuple(args, "O", &pymodel))
return NULL;

double *numero;
if (!(numero = (double*) PyCapsule_GetPointer(pymodel, "DOUBLE"))) {
return NULL;
}

printf("Pointer %x and value %f\n",numero,*numero);

return Py_BuildValue("");
}

static PyObject* example (PyObject *dummy, PyObject *args)
{
double *numero;
double valnum = 6.0;
numero = &valnum;

printf("Pointer %x and value %f\n",numero,*numero);
PyObject * ret = PyCapsule_New(numero, "DOUBLE", NULL);

return ret;
}

/* Module method table */
static PyMethodDef LIBIRWLSMethods[] = {
{"example", example, METH_VARARGS, "descript of example"},
{"example2", example2, METH_VARARGS, "prediction using a trained model"},
{ NULL, NULL, 0, NULL}
};

/* module initialization */
PyMODINIT_FUNC initLIBIRWLS(void)
{
(void) Py_InitModule("LIBIRWLS", LIBIRWLSMethods);
}

使用 setup.py 文件安装此扩展后,我们从 python 调用函数:

import LIBIRWLS

myCapsule = LIBIRWLS.example()
LIBIRWLS.example2(myCalsule)

这是运行 python 代码后的标准输出:

Pointer b9c27b58 and value 6.000000
Pointer b9c27b58 and value 0.000000

指针地址已正确传递,但它丢失了值,我们不知道原因。

最佳答案

您正在尝试传递一个指向堆栈上的值的指针。参见 this question为什么这是个坏主意。要传递指针,您需要从堆中分配内存:

static PyObject *example2 (PyObject *dummy, PyObject *args)
{
PyObject *pymodel = NULL;
if (!PyArg_ParseTuple(args, "O", &pymodel))
return NULL;

double *numero;
if (!(numero = (double*) PyCapsule_GetPointer(pymodel, "DOUBLE")))
return NULL;

printf("Pointer %p and value %f\n", numero, *numero);

return Py_BuildValue("");
}

static PyObject* example (PyObject *dummy, PyObject *args)
{
double *numero = (double *) PyMem_Malloc(sizeof(double *));
if (NULL == numero)
return NULL;
*numero = 6.0;

printf("Pointer %p and value %f\n", numero, *numero);

PyObject * ret = PyCapsule_New(numero, "DOUBLE", NULL);
return ret;
}

输出

Pointer 0x7f9103d173f0 and value 6.000000
Pointer 0x7f9103d173f0 and value 6.000000

关于python - 在 C 和 Python 之间传递的 C 指针(使用胶囊)为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40166645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com