如何使C包装器(用32位Python编写)在运行64位Python的新机器上工作?

2024-05-13 23:21:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在我们的开发机器(32位,运行32位python2.7)上使用pythoncapi编写了一个C包装器。此后,我不得不将包装器和C源代码移到另一台64位的机器上,该机器运行64位的Python2.6。C包装器中的以下代码在64位机器上返回分段错误,但在32位机器上不返回分段错误(在32位机器上工作正常):

static PyObject *tide3_tide_hours(PyObject *self, PyObject *args) {
    double initHour, z0, delt;
    char f_seasonal;
    int numHours;

    // Parse arguments from Python
    if (!PyArg_ParseTuple(args, "ddsid", &initHour, &z0,
                                         &f_seasonal, &numHours, &delt))
        return NULL;

    // Allocate memory for zhr, which is the output we want
    zhr = (double *) malloc ((numHours) *sizeof (double));

    // Call the C source code
    int value = tide_hours(&tc, initHour,
                           z0, f_seasonal, numHours, zhr, delt);

    // Construct the Python return object by defining 
    // a new list and looping over zhr
    int i;
    PyObject *l = PyList_New(0);
    if (!l) {
        printf("No list \n");
        return NULL;
    }

    for (i=0; i < numHours; i++) {
        PyList_Append(l,PyFloat_FromDouble(zhr[i]));
        //printf("%f \n",zhr[i]);
    }

    // Free memory and return the Python list containing zhr to Python
    free (zhr);

    return l;
}

注意&tc只是我在Python中定义的一个结构类,并在C包装器的开头初始化。我想要zhr(在C源代码中由tide\u hours计算),如果我在for循环中取消对printf语句的注释,就可以看到它的正确值。如果我插入:

printf("Size of zhr: %d\n",sizeof(zhr));

在为zhr分配内存之后,我在32位机器上看到'4',在64位机器上看到'8'。我确信这就是代码返回分段错误的原因,但我不知道如何阻止这种情况发生。你知道吗

我检查了C包装器/Python代码的其余部分,并将问题缩小到本节。输入参数是正确的值和类型。如前所述,zhr的计算和输出是按tide\u hours正确的(如果我在for循环中使用printf),但是内存分配出了问题,这与32到64位的开关有关。我不熟悉编写C包装器(这是我的第一个包装器),所以我想知道是否有一种方法可以解决这个问题,或者是否有其他我甚至没有想到的东西导致了这个问题。提前谢谢,如果你需要更多的代码请告诉我。你知道吗


Tags: the代码机器forreturn错误pyobjectdouble
1条回答
网友
1楼 · 发布于 2024-05-13 23:21:36

编辑时间:

两种选择:

1)确保您的包装器被移植到64位并重建它(也许这就是您要求帮助的内容如果是这样,tide_hours函数的原型/实现是什么?),或

2)使用现有的32位编译包装器,然后您的64位计算机还需要安装32位python C运行时,然后您就可以将该运行时用于包装器。你知道吗

对于类似的过程,请阅读:

相关问题 更多 >