我希望能够从Python脚本中调用共享库内的C函数,但在传递指针时会出现问题,被调用函数内的64位地址似乎被截断为32位地址。Python和我的库都是64位的。
以下示例代码演示了这个问题。Python脚本打印传递给C函数的数据的地址。接着,在被调用的C函数内打印接收到的地址。此外,C函数通过打印局部创建内存的大小和地址证明它是64位的。如果以任何其他方式使用指针,则结果将是段错误。
CMakeLists.txt:
以下示例代码演示了这个问题。Python脚本打印传递给C函数的数据的地址。接着,在被调用的C函数内打印接收到的地址。此外,C函数通过打印局部创建内存的大小和地址证明它是64位的。如果以任何其他方式使用指针,则结果将是段错误。
CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
add_library(plate MODULE plate.c)
plate.c
#include <stdio.h>
#include <stdlib.h>
void plate(float *in, float *out, int cnt)
{
void *ptr = malloc(1024);
fprintf(stderr, "passed address: %p\n", in);
fprintf(stderr, "local pointer size: %lu\n local pointer address: %p\n", sizeof(void *), ptr);
free(ptr);
}
test_plate.py
import numpy
import scipy
import ctypes
N = 3
x = numpy.ones(N, dtype=numpy.float32)
y = numpy.ones(N, dtype=numpy.float32)
plate = ctypes.cdll.LoadLibrary('libplate.so')
print 'passing address: %0x' % x.ctypes.data
plate.plate(x.ctypes.data, y.ctypes.data, ctypes.c_int(N))
python-2.7输出结果
在[1]处:运行../test_plate.py
传递地址:7f9a09b02320
传递的地址:0x9b02320
本地指针大小:8
本地指针地址:0x7f9a0949a400
long
是32位,而long long
是64位。 - Eryk Sundtype = numpy.float32
创建数组,则示例将有效。 - papahabla