Erstellen von 64-Bit-C-Python-Erweiterungen unter Windows
Lesezeit: 3 Minuten
Alexandros
Ich stelle diese Frage, weil ich ein bestimmtes Modul erstellen muss (aspell_python, http://wm.ite.pl/proj/aspell-python/), um mit meinem 64-Bit-Python 2.6 zu arbeiten, das auf einem Windows 7-Computer (natürlich 64-Bit) läuft. Ich wollte auch schon immer wissen, wie man bestimmte Funktionen mit C-Code beschleunigen kann, daher möchte ich in Zukunft meine eigenen externen C-Module für Python erstellen.
Kann mir bitte jemand sagen, welche Schritte erforderlich sind, um erfolgreich eine 64-Bit-Python-Erweiterung in C zu erstellen? Ich kenne Python, ich kenne C, aber ich weiß nichts über Visual Studio oder Windows-spezifische Entwicklerangelegenheiten. Ich habe versucht, der offiziellen Anleitung auf der Python-Website (http://docs.python.org/extending/windows.html#building-on-windows) mit Visual Studio 2008 zu folgen (das das einzige kommerzielle Produkt ist, das hier verfügbar ist), aber Selbst das grundlegendste Beispiel würde nicht erstellt werden können.
Hinzufügen wie selbst das grundlegendste Beispiel schlägt fehl.
– Prof. Falken
7. Januar 2011 um 10:42 Uhr
Zum Beispiel: Nachdem ich allen Anweisungen gefolgt bin und versuche, example_nt zu erstellen, erhalte ich den Linker-Fehler, dass python26.lib nicht gefunden werden kann. Ich habe dann versucht, die python26.lib zu verwenden, die mit meiner Version von Python vertrieben wird, aber das führte nur zu zwei Linker-Fehlern: 1>example.obj : error LNK2019: unresolved external symbol __imp___Py_NoneStruct referenced in function _ex_foo 1>example.obj : error LNK2019 : nicht aufgelöstes externes Symbol __imp__Py_InitModule4, auf das in Funktion _initexample verwiesen wird
– Alexandros
7. Januar 2011 um 10:50 Uhr
Danach habe ich versucht, python26.lib selbst zu erstellen, indem ich das gesamte Python 2.6-Projekt aus der Quelle mit VS2008 erstellt habe, was natürlich zu einer Reihe von Fehlern führte. Es erzeugte jedoch eine python26_d.lib, die beim Kompilieren zusammen mit example_nt immer noch einen Linker-Fehler ausgab
– Alexandros
7. Januar 2011 um 10:52 Uhr
Das Erstellen von example_nt mit „python setup.py build“ sollte auf Python 2.6.6 AMD64 sofort einsatzbereit sein, wenn Sie Visual Studio 2008 Professional mit dem 64-Bit-Compiler installiert haben.
– cgohlke
7. Januar 2011 um 18:33 Uhr
Höchstwahrscheinlich haben Sie Visual Studio 2008 Professional nicht richtig installiert. Der 64-Bit-Compiler ist eine Option, die bei der Installation aktiviert werden muss. Falls Sie Visual Studio 2008 Express verwenden, wird dies nicht mit einem 64-Bit-Compiler geliefert.
– cgohlke
8. Januar 2011 um 17:56 Uhr
Ich habe zuvor erfolgreich C-Erweiterungen für Python unter 64-Bit-Windows kompiliert, indem ich die folgenden Befehle von der „Visual Studio 2008 x64 Win64-Eingabeaufforderung“ im Verzeichnis der obersten Ebene der Quelldistribution der Erweiterung ausgeführt habe:
set DISTUTILS_USE_SDK=1
set MSSdk=1
python setup.py install
Dies scheint mit VS 2012 für mich zu funktionieren … Ich hatte so viele Schmerzen.
Wenn das nicht funktioniert und Sie die C-Compiler-Umgebung von Microsoft zum Laufen bringen können, versuchen Sie es Cython. Dieses Tutorial vergleicht eine normale Python-Erweiterung mit ihrer generierten C-Version. Aktualisierte 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}
)
Hinzufügen wie selbst das grundlegendste Beispiel schlägt fehl.
– Prof. Falken
7. Januar 2011 um 10:42 Uhr
Zum Beispiel: Nachdem ich allen Anweisungen gefolgt bin und versuche, example_nt zu erstellen, erhalte ich den Linker-Fehler, dass python26.lib nicht gefunden werden kann. Ich habe dann versucht, die python26.lib zu verwenden, die mit meiner Version von Python vertrieben wird, aber das führte nur zu zwei Linker-Fehlern: 1>example.obj : error LNK2019: unresolved external symbol __imp___Py_NoneStruct referenced in function _ex_foo 1>example.obj : error LNK2019 : nicht aufgelöstes externes Symbol __imp__Py_InitModule4, auf das in Funktion _initexample verwiesen wird
– Alexandros
7. Januar 2011 um 10:50 Uhr
Danach habe ich versucht, python26.lib selbst zu erstellen, indem ich das gesamte Python 2.6-Projekt aus der Quelle mit VS2008 erstellt habe, was natürlich zu einer Reihe von Fehlern führte. Es erzeugte jedoch eine python26_d.lib, die beim Kompilieren zusammen mit example_nt immer noch einen Linker-Fehler ausgab
– Alexandros
7. Januar 2011 um 10:52 Uhr
Das Erstellen von example_nt mit „python setup.py build“ sollte auf Python 2.6.6 AMD64 sofort einsatzbereit sein, wenn Sie Visual Studio 2008 Professional mit dem 64-Bit-Compiler installiert haben.
– cgohlke
7. Januar 2011 um 18:33 Uhr
Höchstwahrscheinlich haben Sie Visual Studio 2008 Professional nicht richtig installiert. Der 64-Bit-Compiler ist eine Option, die bei der Installation aktiviert werden muss. Falls Sie Visual Studio 2008 Express verwenden, wird dies nicht mit einem 64-Bit-Compiler geliefert.
– cgohlke
8. Januar 2011 um 17:56 Uhr