2011-01-07 10 views
23

Ich stelle diese Frage, weil ich ein bestimmtes Modul (aspell_python, http://wm.ite.pl/proj/aspell-python/) erstellen muss, um mit meinem 64-Bit-Python 2.6 zu arbeiten, das auf einem Windows 7 (64-Bit von Natürlich) Maschine. Ich wollte auch immer wissen, wie man bestimmte Funktionen mit C-Code beschleunigt, damit ich in Zukunft eigene externe C-Module für Python entwickeln kann.Erstellen von 64-Bit-C-Python-Erweiterungen unter Windows

Kann mir bitte jemand die Schritte sagen, die erforderlich sind, um eine 64-Bit-Python-Erweiterung in C erfolgreich zu erstellen? Ich kenne Python, ich kenne C, aber ich weiß nichts über Visual Studio oder Windows spezifische Entwicklerangelegenheiten. Ich habe versucht, dem offiziellen Leitfaden auf der Python-Website (http://docs.python.org/extending/windows.html#building-on-windows) zu folgen, indem ich Visual Studio 2008 (das einzige kommerzielle Produkt, das hier verfügbar ist) benutze Selbst das grundlegendste Beispiel würde nicht bauen.

+5

Hinzufügen * wie * selbst das grundlegendste Beispiel fehlschlägt. –

+1

Zum Beispiel: nach dem Befolgen jeder Richtung, wenn ich versuche, example_nt zu bauen, bekomme ich den Linker-Fehler, dass es python26.lib nicht finden kann. Ich versuchte dann, die python26.lib zu verwenden, die mit meiner Version von Python verteilt wird, aber das führte nur zu zwei Linker-Fehlern: 1> example.obj: Fehler LNK2019: nicht aufgelöstes externes Symbol __imp___Py_NoneStruct referenziert in Funktion _ex_foo 1> example.obj: error LNK2019: ungelöstes externes Symbol __imp__Py_InitModule4 referenziert in Funktion _initexample – Alexandros

+0

Danach habe ich versucht, python26.lib selbst zu erstellen, indem ich das gesamte Python 2.6 Projekt von der Quelle mit VS2008 erstellte, was natürlich zu einer Reihe von Fehlern führte. Es erzeugte jedoch eine python26_d.lib, die immer noch einen Linkerfehler verursachte, wenn sie mit example_nt kompiliert wurde. – Alexandros

Antwort

8

ich erfolgreich C-Erweiterungen für Python auf 64-Bit-Windows vor, indem Sie die folgenden Befehle aus dem „Visual Studio 2008 x64 Win64-Eingabeaufforderung“ in der obersten Ebene der Quelle Verteilung der Erweiterung kompiliert haben:

+0

Das scheint mit VS 2012 für mich zu arbeiten ... Ich hatte so viele Schmerzen. –

2

Ich würde Shed Skin verwenden: Einfach herunterladen, entpacken, starten Sie die init bat und compile your Python code.

Wenn das nicht funktioniert, und Sie können Microsoft C-Compiler-Umgebung arbeiten, versuchen Sie Cython. This tutorial vergleicht eine normale Python-Erweiterung mit ihrer generierten C-Version. Aktualisiert Auszüge:

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} 
) 

Kompilierung:

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) 
Verwandte Themen