Python está passando o endereço do ponteiro de 32 bits para funções C

Eu gostaria de chamar minhas funções C dentro de uma biblioteca compartilhada de scripts Python. Problema chega ao passar ponteiros, os endereços de 64 bits parecem ser truncados para endereços de 32 bits dentro da função chamada. Tanto o Python quanto minha biblioteca são 64 bits.

Os códigos de exemplo abaixo demonstram o problema. O script Python imprime o endereço dos dados sendo passados ​​para a função C. Em seguida, o endereço recebido é impresso a partir da função C chamada. Além disso, a função C prova que é de 64 bits, imprimindo o tamanho e o endereço da criação local de memória. Se o ponteiro é usado de qualquer outra forma, o resultado é um segfault.

CMakeLists.txt

cmake_minimum_required (VERSION 2.6) 
add_library(plate MODULE plate.c)

prato.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))

Saída do python-2.7

Em [1]: execute ../test_plate.py

endereço de passagem: 7f9a09b02320

endereço passado: 0x9b02320

tamanho do ponteiro local: 8

endereço de ponteiro local: 0x7f9a0949a400

questionAnswers(4)

yourAnswerToTheQuestion