Ich habe ein Python2.6-Programm, das Python-Module laden kann, die mit Cython in .so-Dateien kompiliert wurden. Ich habe Cython verwendet, um die .py-Module zu .so-Dateien zu kompilieren, und alles funktioniert einwandfrei.
Dies ist die Datei setup.py, die ich mit Cython verwende:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("ldap", ["ldap.pyx"]),
Extension("checker", ["checker.pyx"]),
Extension("finder", ["finder.pyx"]),
Extension("utils", ["utils.pyx"]),
]
setup(
name = 'bchecker',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
Ich weiß also, dass ich Python-Module mit Cython kompilieren kann (ich denke, Cython erstellt 'C'-Dateien aus meinen Python-Dateien und kompiliert sie dann), aber kann ich mein Haupt-Python-Programm zu etwas kompilieren, das ich auf einer Linux-Plattform ausführen kann? In diesem Fall wäre ein Cython-Befehlszeilenbeispiel wünschenswert. Vielen Dank.
Antworten:
Im Gegensatz zu dem, was Adam Matan und andere behaupten, Sie können in der Tat eine ausführbare Binärdatei mit Cython erstellen, von einer reinen Python (Py) Datei.
Ja, Cython soll wie angegeben verwendet werden, um das Schreiben von C / C ++ - Erweiterungsmodulen für die CPython-Python-Laufzeit zu vereinfachen.
Wie Nudzo in diesem Kommentar anspielt , können Sie den
--embed
Schalter an der Eingabeaufforderung verwenden.Hier ist ein äußerst einfaches Beispiel. Ich verwende dies von einer Debian Sid-Workstation aus mit Python3 und Cython3.
Stellen Sie sicher, dass Sie zuvor die Pakete python-dev oder python3-dev installiert haben.
1) Erstellen Sie ein sehr einfaches Python-Programm namens hello.py
2) Verwenden Sie Cython, um Ihr Python-Programm in C ...
3) Verwenden Sie GCC, um hello.c in eine ausführbare Datei namens hello ... zu kompilieren.
gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl
4) Am Ende erhalten Sie eine Datei namens Hallo ...
$ ldd hello linux-vdso.so.1 (0x00007fff273fe000) libpython3.3m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.3m.so.1.0 (0x00007fc61dc2c000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61da0f000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61d70b000) libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc61d508000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61d304000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61cf5a000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61cd52000) libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc61cb28000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc61c90f000) /lib64/ld-linux-x86-64.so.2 (0x00007fc61e280000)
In diesem Fall ist die ausführbare Datei auf meinem Debian-System dynamisch mit Python 3.3 verknüpft.
5) lauf hallo ...
Wie Sie sehen, können Sie mit dieser Methode Cython grundsätzlich verwenden, um Ihre reinen Python-Anwendungen in ausführbaren, kompilierten Objektcode zu konvertieren.
Ich verwende diese Methode für wesentlich komplexere Anwendungen - zum Beispiel eine vollständige Python / PySide / Qt-Anwendung.
Für verschiedene Versionen von Python passen Sie das gcc an
-I
und-l
wechseln entsprechend.Sie können die ausführbare Datei dann als Distributionsdatei (.deb usw.) verpacken, ohne die Python / PySide / Qt-Dateien packen zu müssen. Der Vorteil besteht darin, dass Ihre Anwendung auch nach einem Distributionsupdate noch ausgeführt werden kann Versionen von Python usw. auf dieser Distribution.
quelle
cython --embed -o /tmp/a.c a.py
undgcc -Os -I /usr/include/python2.7 -o /tmp/a/tmp/a.c -lpython2.7 -lpthread -lm -lutil -ldl
Werfen Sie einen Blick auf die Antworten auf Kann Cython zu einer EXE kompilieren? die im Gegensatz zu allen anderen Antworten hier sagen, dass es ja möglich ist, zu einer ausführbaren Datei zu kompilieren.
Die Links bei Embedding Cython scheinen ein guter Anfang zu sein, aber es ist nicht Cythons Hauptzweck, daher weiß ich nicht, wie einfach es sein würde.
quelle
Ich weiß nicht, ob das helfen wird oder nicht, aber Nudzo ist richtig. Sie können es mit bekommen
cython --embed -o main.o main.py
und dann versuche ich, das Ergebnis mit cl / EHsc zu kompilierenquelle
Sie können nicht, Cython ist nicht dafür gemacht, Python zu kompilieren oder es in eine ausführbare Datei umzuwandeln.
Verwenden Sie py2exe , um eine EXE- Datei zu erstellen .
Verwenden Sie zum Erstellen eines Pakets für Mac oder Linux den Prozess des regulären Verpackungssystems, da ein Skriptsprachenprogramm in Unix env nichts Spezifisches enthält.
quelle
cython --embed
welche, die ausführbare Dateien mit eingebettetem Python erzeugen können.