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

C-Modul für Python schreiben

Beitragvon droptix » Montag 21. April 2008, 12:06

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:

Beitragvon Sr4l » Montag 21. April 2008, 19:36

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=]gcc embedding.c C:\cygwin\bin\libpython2.5.dll -IC:\cygwin\usr\include\python2.5\ -o embedding.exe[/code]
in C:\cygwin\usr\include\python2.5\ liegt die Python.h


Das Python extending Beispiel funktioniert bei mir nicht weil:
[code=]/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[/code]

"@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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 21. April 2008, 21:14

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

Beitragvon Sr4l » Montag 21. April 2008, 21:22

Leonidas hat geschrieben:Warum sollte man unter Windows Cygwin-Python verwenden?


Weil sonst:
[code=]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
[/code]
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Dienstag 22. April 2008, 07:51

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:

Beitragvon Sr4l » Dienstag 22. April 2008, 08:31

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder