Cython for dummies

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

Guten abend,

ich hätte gern aus meinem Python Programm eine .exe bzw. ein binary gemacht,
was auch 'alleine' verteilbar/lauffähig ist.
Dazu habe ich cython probiert nach:
http://docs.cython.org/src/userguide/tutorial.html
Die (unter Ubuntu) erzeugte .so lässt sich auch benutzen (von python aus)
aber wenn ich das erzeugte helloworld.c duch den gcc jage, hagelt es Fehler-
meldungen:

Code: Alles auswählen

"Python.h,  structmember.h . ... nicht gefunden,
#error Python headers needed to compile C extensions, please install development version of Python .  .  ."
Was muss ich tun?
joh
BlackJack

@joh#: Die Fehlermeldung sagt es doch im Grunde ziemlich deutlich: Die Python.h-Headerdatei konnte nicht gefunden werden. Entweder ist sie nicht vorhanden oder der Compiler braucht den Hinweis wo er sie finden kann.

Aber wozu soll der manuelle Aufruf gut sein, wenn Du doch schon anderweitig die *.so erzeugt hast? Falls Du hoffst dadurch ein Programm heraus zu bekommen, dann hast Du falsche Erwartungen. Cython erzeugt C-Quelltext für Erweiterungsmodule für CPython und keine eigenständigen Programme.
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

BlackJack hat geschrieben: Falls Du hoffst dadurch ein Programm heraus zu bekommen, dann hast Du falsche Erwartungen. Cython erzeugt C-Quelltext für Erweiterungsmodule für CPython und keine eigenständigen Programme.
mmmhhh.... Ich dachte wenn cython C-Quelltext erzeugt,kann ich den auch einfach mit gcc übersetzen...?
Was nehmen wir denn dann ein eigenständiges Programm zu bekommen?
joh
lunar

@joh#: Es gibt keinen Python-Compiler, der aus Python-Modulen nativ ausführbare Dateien erzeugt. Was es gibt, sind Projekte wie pyinstaller oder py2exe, die ein Modul mitsamt dem Python-Interpreter und allen Abhängigkeiten so verpacken, dass man das Resultat ausführen kann, ohne den Python-Interpreter installieren zu müssen. Es läuft dann aber trotzdem noch ein Python-Interpreter.

Im Allgemeinen braucht es das nur unter Windows, unter Linux ist Python eigentlich immer vorinstalliert.
BlackJack

@joh#: Cython erzeugt C-Quelltext und den kann man auch mit gcc übersetzen. Aber nicht jeder C-Quelltext beschreibt ein eigenständig lauffähiges Programm. Bibliotheken alleinstehend oder Module/Plugins ohne die Wirtsumgebung auszuführen macht ja auch keinen Sinn.

Warum willst Du denn ein ”eigenständiges” Programm haben? Dazu noch unter Linux? Das ist dort sehr unüblich.
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

BlackJack hat geschrieben:@joh#: Cython erzeugt C-Quelltext und den kann man auch mit gcc übersetzen. Aber nicht jeder C-Quelltext beschreibt ein eigenständig lauffähiges Programm. Bibliotheken alleinstehend oder Module/Plugins ohne die Wirtsumgebung auszuführen macht ja auch keinen Sinn.
OK, langsam versteh' ich es, sie SW Umgebung sieht mittlerweile anders aus als zur
Nachwendezeit, als der Pascal-Compiler eine .exe/.com ausspuckte, die dann 'überall' lief.
BlackJack hat geschrieben: Warum willst Du denn ein ”eigenständiges” Programm haben? Dazu noch unter Linux? Das ist dort sehr unüblich.
Ich hab letztes Weihnachten für Linux ein DVD-Abspielprogramm bestellt, da kam dann eine
Datei, draufkopiert, gestartet fertig. Fand ich irgendwie einfach und damit gut. Und wenn ich
in Python "hallowelt" ausgeben lasse, dann sollten doch die Abhängigkeiten von Bibliothen dgl.
nicht so riesig sein, daraus ein 'eigenständiges' Binary zu machen.
joh

Anekdote/OT:
Als ich das mitgelieferte Programm zum einfachen Auslesen meines Geiger-Zählers über RS232 benutzen wollte, installierte das erstmal lustige 115 MB .NET Umgebung und
dann nochmal zig MB Acroread9 . . .
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

lunar hat geschrieben: Im Allgemeinen braucht es das nur unter Windows, unter Linux ist Python eigentlich immer vorinstalliert.
D.h. ich kann immer darauf vertrauen, bei einem x-beliebeigen linux einen python Interpreter
vorzufinden?
joh
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

joh# hat geschrieben:Anekdote/OT:
Als ich das mitgelieferte Programm zum einfachen Auslesen meines Geiger-Zählers über RS232 benutzen wollte, installierte das erstmal lustige 115 MB .NET Umgebung und
dann nochmal zig MB Acroread9 . . .
So OT ist das gar nicht, den das ist genau _der_ Grund warum man keine eigenstaendigen Programme ausliefert. Wenn jedes Programm seine Abhaengigkeiten mitbringt ...

Ein Programm ueber die Paketverwaltung zu installieren ist im allgemeinen _noch_ einfacher, da man die Programme nichtmal herunterladen muss.

Auf jedem "x-beliebigen" Linux nicht unbedingt, aber jede groessere Distribution hat ein Python dabei, das Problem ist die Version, jens hat dazu erst einen Thread aufgemacht: http://www.python-forum.de/viewtopic.php?f=1&t=27526
lunar

@joh#: Auf jedem “x-beliebigen Linux“ sicherlich nicht, doch auf allen gängigen Desktop-Distributionen für den normalen, ahnungslosen PC-Nutzer. Und die Nutzer mit Ahnung sind eh in der Lage, Python nachzuinstallieren.

Wenn Du bei Python "hello world" ausgeben lässt, passiert im Hintergrund wesentlich mehr als beim äquivalenten Programm in C oder Pascal. Der hohe Abstraktionsgrad von Python, samt all der schönen netten Features, die einem das Python-Programmieren so versüßen, kommen ja nicht aus dem Nichts, sondern werden durch eine umfangreiche Laufzeitumgebung gestellt.

Die Technik hat sich seit der Nachwendezeit um Einiges weiterentwickelt, Anwendungen sind komplexer geworden, und mithin benötigt man auch mächtigere Sprachen, mit entsprechend umfangreichen Laufzeitumgebungen.

Fazit: Es ist zum gegenwärtigen Zeitpunkt nicht möglich, ein wirklich eigenständiges Python-Programm zu erzeugen, wenn man eigenständig im Sinne von C definiert. Wobei selbst das nicht wirklich eigenständig ist, da auch ein C-Programm an einer Laufzeitbibliothek (nämlich der C-Standardbibliothek) und am Betriebssystem selbst hängt. Ein kompiliertes C-Programm ist also beleibe nicht eigenständig, und lässt sich auch nicht überall ausführen. Über die Grenzen verschiedener Betriebssysteme hinweg nicht, und manchmal nicht einmal über verschiedene Distributionen hinweg.

Zu Deiner Anekdote: Wie alt ist Dein System, dass Du .NET nachinstallieren müsstest?! .NET wird seit Jahren über Windows Update verteilt, und ist eigentlich auf jedem modernen System installiert…
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

lunar hat geschrieben:Wie alt ist Dein System, dass Du .NET nachinstallieren müsstest?! .NET wird seit Jahren über Windows Update verteilt, und ist eigentlich auf jedem modernen System installiert…
das ist ein Win XP SP3 in einer Virtualbox laufend
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also ein System was inzwischen ziemlich genau 10 Jahre alt ist (25. Oktober 2001), die aktuellsten Patches auch über 3 Jahre her (SP3 = 21. April 2011). Ich denke ich brauche nicht sagen, wie die Computer-Welt Anno 2001 ausgesehen hat... modern ist was anderes.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
NiklasRosenstein
User
Beiträge: 17
Registriert: Donnerstag 16. Juni 2011, 21:38

Das --embed Kommandozeilen-argument weist Cython dazu an, den Code für eine ausführbare Datei zu erstellen. Vergiss allerdings nicht, dass die python27.dll (oder andere, je nach Python Version) vorhanden sein muss.

Grüße, Niklas
BlackJack

@NiklasRosenstein: Nicht nur die DLL sondern mindestens alles was man direkt oder indirekt an Modulen benutzt hat.
Antworten