C-Modul für Python schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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...
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Warum sollte man unter Windows Cygwin-Python verwenden?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

genau so habe ich es unter VC 2005 gemacht ;-)
Antworten