2011-01-07 20 views
23

Estoy haciendo esta pregunta porque necesito construir un módulo específico (aspell_python, http://wm.ite.pl/proj/aspell-python/) para trabajar con mi Python 2.6 de 64 bits que se ejecuta en un Windows 7 (64 bits de por supuesto) máquina. También siempre quise saber cómo acelerar ciertas funciones con código C, así que me gustaría crear mis propios módulos C externos para Python en el futuro.Creando extensiones C de Python de 64 bits en Windows

¿Puede alguien decirme los pasos necesarios para construir con éxito una extensión de Python de 64 bits en C? Conozco a Python, conozco a C pero no conozco los temas específicos de desarrollo de Visual Studio o Windows. Traté de seguir la guía oficial en el sitio web de Python (http://docs.python.org/extending/windows.html#building-on-windows) usando Visual Studio 2008 (que es el único producto comercial disponible aquí) pero incluso el ejemplo más básico fallaría en la construcción.

+5

Agregue * cómo * incluso el ejemplo más básico falla. –

+1

Por ejemplo: después de seguir todas las instrucciones, cuando intento compilar example_nt aparece el error del enlazador de que no puede encontrar python26.lib. Luego traté de usar el python26.lib que se distribuye con mi versión de python pero que solo dio como resultado dos errores del enlazador: 1> ejemplo.obj: error LNK2019: símbolo externo no resuelto __imp___Py_NoneStruct al que se hace referencia en la función _ex_foo 1> ejemplo.obj: error LNK2019: símbolo externo no resuelto __imp__Py_InitModule4 al que se hace referencia en la función _initexample – Alexandros

+0

después de eso, traté de construir python26.lib yo mismo construyendo todo el proyecto de la versión 2.6 de Python desde la fuente usando VS2008, lo que resultó en una serie de errores, por supuesto. Sin embargo, produjo un python26_d.lib que todavía dio un error de enlazador cuando se compiló junto con example_nt – Alexandros

Respuesta

8

He compilado con éxito extensiones en C para Python en Windows de 64 bits antes ejecutando los siguientes comandos desde el "Visual Studio 2008 x64 Win64 Símbolo del sistema" en el directorio de nivel superior de la distribución de la fuente de la extensión:

set DISTUTILS_USE_SDK=1 
set MSSdk=1 
python setup.py install 
+0

Esto parece funcionar con VS 2012 para mí ... Había tenido tanto dolor. –

2

Yo usaría Shed Skin: Simplemente descargue, descomprima, ejecute el init bat, y compile your Python code.

Si eso no funciona, y puede obtener el entorno de compilador C de Microsoft funcionando, intente Cython. This tutorial compara una extensión de Python normal con su versión C generada. extractos Actualizado:

c_prime.pyx:

def calculate(long limit): 
    cdef long current 
    cdef long divisor 
    primes = [] 
    divisor = 0 
    for current in range(limit): 
     previous = [] 
     for divisor in range(2, current): 
      if current % divisor == 0: 
       break 
     if divisor == current - 1: 
      primes.append(current) 
    return primes 

setup.py:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

setup(
    name = 'PrimeTest', 
    ext_modules=[ 
    Extension('c_prime', ['c_prime.pyx']) 
    ], 
    cmdclass = {'build_ext': build_ext} 
) 

de compilación:

python setup.py build_ext --inplace --compiler=msvc

test_prime.py:

from timeit import Timer 

t = Timer('c_prime.calculate(10000)', 'import c_prime') 
reps = 5 
print(sum(t.repeat(repeat=reps, number=1))/reps) 
Cuestiones relacionadas