Erstellen von 64-Bit-C-Python-Erweiterungen unter Windows

Lesezeit: 3 Minuten

Benutzer-Avatar
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.

    – Mark Harviston

    28. September 2013 um 4:41 Uhr

Benutzer-Avatar
Cees Timmermann

Ich würde verwenden Häuten: Einfach herunterladen, entpacken, Init-Bat ausführen und kompilieren Sie Ihren Python-Code.

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

kompilieren:

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)

1345630cookie-checkErstellen von 64-Bit-C-Python-Erweiterungen unter Windows

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy