Seite 1 von 1

C-Modul für Python schreiben

Verfasst: Montag 21. April 2008, 12:06
von droptix
Bastle was für Windows und muss dafür einigen Code in C++ schreiben, den ich als C-Modul in Python einbinden möchte.

Möchte am liebsten in Visual C++ 2008 Express compilieren, weil einige spezifische Windows-Sachen dabei sind, die sich dort problemlos compilieren lassen. Problem: Ich kann mein Python C-Modul nicht in V++ Express compilieren, weil es irgendwie Probleme beim Einbinden der Python-Header-Dateien gibt.

Ist hier jemand unterwegs, der mit V++ Express arbeitet und sich seine eigenen Python C-Module bäckt und mir vielleicht weiter helfen kann? Konkrete Fehlerbeschreibung schicke ich dann noch hinterher...

Verfasst: Montag 21. April 2008, 19:36
von Sr4l
Du darfst ruhig die Fehlermeldung verraten ;-)

GCC
so sieht mein compile-Befehlt für Python embedding aus, sollte für extending nur ein bisschen anders aussehen:

Code: Alles auswählen

gcc embedding.c C:\cygwin\bin\libpython2.5.dll  -IC:\cygwin\usr\include\python2.5\ -o embedding.exe
in C:\cygwin\usr\include\python2.5\ liegt die Python.h


Das Python extending Beispiel funktioniert bei mir nicht weil:

Code: Alles auswählen

/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to `_WinMain@16'
collect2: ld gab 1 als Ende-Status zur"uck
"@16" könnte vielleicht auf 16bit Hinweisen was bei meinem 64bit nicht mehr zur Verfügung steht? Ich habe keine Ahnung.

Visual C++ 2005
Unter Visual C++ 2005 Express Edition geht es bei mir.

Verfasst: Montag 21. April 2008, 21:14
von Leonidas
Warum sollte man unter Windows Cygwin-Python verwenden?

Verfasst: Montag 21. April 2008, 21:22
von Sr4l
Leonidas hat geschrieben:Warum sollte man unter Windows Cygwin-Python verwenden?
Weil sonst:

Code: Alles auswählen

C:\Users\Sr4l\DreamInCode\C\source\extending>gcc extending.c "C:\Program Files (x86)\Python\libs\libpython25.a"  -I"C:\Program Files (x86)\Python\include" -o extending2.exe
In file included from C:/Program Files (x86)/Python/include/Python.h:84,
                 from extending.c:1:
C:/Program Files (x86)/Python/include/intobject.h:44: Fehler: Fehler beim Parsen vor "PyInt_AsUnsignedLongLongMask"
C:/Program Files (x86)/Python/include/intobject.h:44: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
In file included from C:/Program Files (x86)/Python/include/Python.h:86,
                 from extending.c:1:
C:/Program Files (x86)/Python/include/longobject.h:43: Warnung: Parameternamen (ohne Typen) in Funktionsdeklaration
C:/Program Files (x86)/Python/include/longobject.h:45: Fehler: Fehler beim Parsen vor "PyLong_AsLongLong"
C:/Program Files (x86)/Python/include/longobject.h:45: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
C:/Program Files (x86)/Python/include/longobject.h:46: Fehler: Fehler beim Parsen vor "PyLong_AsUnsignedLongLong"
C:/Program Files (x86)/Python/include/longobject.h:46: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
C:/Program Files (x86)/Python/include/longobject.h:47: Fehler: Fehler beim Parsen vor "PyLong_AsUnsignedLongLongMask"
C:/Program Files (x86)/Python/include/longobject.h:47: Warnung: Datendefinition hat keinen Typ oder Speicherklasse

Verfasst: Dienstag 22. April 2008, 07:51
von droptix
Ich hatte immer Probleme die Python.h und die entsprechenden Bibliotheken einzubinden. Habe aber heute eine Kurzanleitung gefunden, mit der ich aus V++ Express eine DLL erzeugen kann, die ich dann nur noch in .pyd umbenennen muss. Man muss halt den `include` und `libs` Pfad zusätzlich angeben, nur wusste ich bislang nicht genau wo. Und man muss die Projektkonfiguration auf "Release" einstellen, sonst geht nix.

[Edit:] Hier nun also die Kurzanleitung:

1. Neues, leeres Projekt erstellen.
2. .cpp-Datei erstellen unter "Quelldateien" und dort das Modul schreiben
3. Unter Extras -> Optionen -> Projekte und Projektmappen -> VC++ Verzeichnisse als zusätzliches Verzeichnis für Includedateien Pythonpfad\include" angeben und unter Bibliotheksdateien "Pythonpfad\libs" angeben
4. Projektkonfiguration auf Release stellen! (WICHTIG!)
5. Projekteigenschaften -> Konfigurationseigenschaften -> Konfigurationstyp: Dynamische Bibliothek" (.dll) einstellen
6. Projekteigenschaften -> Konfigurationseigenschaften -> C/C++ -> Codegenerierung -> Laufzeitbibliothek: "Multithreaded" (/MT) einstellen
7. Erstellen -> Alles neu erstellen!
8. Die entstandenen DLL in name.pyd umbennen

Verfasst: Dienstag 22. April 2008, 08:31
von Sr4l
genau so habe ich es unter VC 2005 gemacht ;-)