2008-10-10 25 views
28

Wie kann ich eine eigenständige Python-Anwendung unter Linux verteilen?Standalone Python-Anwendungen unter Linux

Ich denke, ich kann das Vorhandensein eines aktuellen Python-Interpreters in jeder modernen Distribution als selbstverständlich ansehen. Das Problem betrifft die Bibliotheken, die nicht zur Standardbibliothek gehören, also wxPython, scipy, python-kryptografisches Toolkit, reportlab und so weiter.

Gibt es einen funktionierenden Linux-Pendant zu, sagen wir, py2exe (die, nebenbei bemerkt, ich habe nie versucht)? Gibt es eine freie, opensource?

Antwort

-10

Nein.

Python ist notorisch flockig in Bezug auf verschiedene Setups. Die einzige sinnvolle Möglichkeit, eine Python-App zu implementieren, besteht darin, das gesamte Paket aus Interpreter und Bibliotheken, auf die Sie sich verlassen, mit Ihrem Code zu versenden. Das wird höchstwahrscheinlich funktionieren.

+2

Das war nicht meine Erfahrung. Sicher, Sie können Bibliotheken von Drittanbietern falsch einrichten oder sogar Python falsch installieren, aber generell hatte ich nie ein Problem mit Standard-Python-Programmen. Außer natürlich zu einer vorherigen Version zu wechseln, wenn Sie neue Funktionen verwendet haben :). Vielleicht haben Sie an Java (tm) gedacht? –

+0

@ A.L.Flanagan: Eigentlich, für alles, was ich hasse Java, ich habe festgestellt, dass es ziemlich robust in Bezug auf die Softwareverteilung. – Marcin

7

Sie können es nicht einfach in einem verteilungsneutralen Format tun. Die einzigen zuverlässigen Mechanismen zur Überwachung der Abhängigkeiten sind in den Paketverwaltungssystemen der Distributionen integriert und variieren von Distribution zu Distribution. Sie werden effektiv rpm für Fedora zu tun haben, debs für ubuntu und debian usw.

Py2exe unter Windows funktioniert gut. Es erstellt eine Distribution mit allen notwendigen DLLs und einem Wrapper für den Python-Interpreter, der Ihr Programm startet. Es ist ziemlich einfach zu installieren - einfach in ein Verzeichnis fallen lassen - also eine msi-Datei zu machen ist trivial.

9

Sie könnten die Abhängigkeit Erklärungen in setuptools suchen. Auf diese Weise kann sichergestellt werden, dass die richtigen Pakete entweder in der Umgebung verfügbar sind oder von jemandem mit den entsprechenden Berechtigungen installiert werden können.

+0

Ich weiß @ S.Lott weiß das, aber für andere: Dies ist eine großartige Möglichkeit, eine Python-Bibliothek oder -Anwendung an andere Entwickler zu verteilen, denen es nichts ausmacht, die richtige Version von Python selbst zu installieren, bevor Ihre Anwendung funktioniert. Aber es ist absolut der falsche Weg, um Endnutzer zu verteilen, die nicht wissen, was Python ist, absolut nicht gehen und installieren, um Ihre Anwendung zu arbeiten, und für die 0,2%, die tun, werden sie das falsche installieren Ausführung. –

22

Erstellen Sie eine Deb (für alles Debian-abgeleitet) und eine U/min (für Fedora/SuSE). Fügen Sie der Verpackung die richtigen Abhängigkeiten hinzu, und Sie können sicher sein, dass es funktioniert.

+1

+1 für die Idee eines Linux-Pakets –

+7

eine gute Referenz für dieses Ende zu Ende? – fabrizioM

+0

http://showmedo.com/videotutorials/video?name=linuxJensMakingDeb&fromSeriesID=37 – bagonyi

5

Setuptools ist für mich übertrieben, da Nutzungs mein Programm ist ziemlich begrenzt ist, so meine homegrown Alternative ist hier.

I bündeln eine „fremde“ Verzeichnis, das alle Voraussetzungen enthält, und verwenden Sie site.addsitedir, so dass sie weltweit nicht installiert werden müssen.

# program startup code 
import os 
import sys 
import site 
path = os.path.abspath(os.path.dirname(__file__)) 
ver = 'python%d.%d' % sys.version_info[:2] 
thirdparty = os.path.join(path, 'third-party', 'lib', ver, 'site-packages') 
site.addsitedir(thirdparty) 

Die meisten meiner Voraussetzungen haben Setup.py-Installer. Jedes gebündelte Modul erhält seinen eigenen "Installations" -Prozess, so dass jedes angepasste Material (z. B. ./configure) automatisch ausgeführt werden kann. Mein Installationsskript führt dieses Makefile als Teil des Installationsprozesses aus.

# sample third-party/Makefile 
PYTHON_VER = `python -c "import sys; \ 
     print 'python%d.%d' % sys.version_info[:2]"` 
PYTHON_PATH = lib/$(PYTHON_VER)/site-packages 
MODS = egenix-mx-base-3.0.0 # etc 

.PHONY: all init clean realclean $(MODS) 
all: $(MODS) 
$(MODS): init 
init: 
    mkdir -p bin 
    mkdir -p $(PYTHON_PATH) 
clean: 
    rm -rf $(MODS) 
realclean: clean 
    rm -rf bin 
    rm -rf lib 

egenix-mx-base-3.0.0: 
    tar xzf [email protected] 
    cd [email protected] && python setup.py install --prefix=.. 
    rm -rf [email protected] 
10

Sie können dazu cx_Freeze verwenden. Es ist wie py2exe (bündelt den Interpreter und das Startskript und alle benötigten Bibliotheken und Module), funktioniert aber sowohl unter Linux als auch unter Windows.

Es sammelt die Abhängigkeiten von der Umgebung, in der es ausgeführt wird, was bedeutet, dass sie auch geeignet für das Ziel sein müssen. Wenn Sie etwas auf 32-Bit-Debian aufbauen und auf einem anderen 32-Bit-Debian installieren, dann ist das in Ordnung.Sie können 32/64-Bit-Unterschiede verarbeiten, indem Sie mehrere Versionen in geeigneten Umgebungen (z. B. 32-Bit- und 64-Bit-Chroots) erstellen und die entsprechenden verteilen. Wenn Sie etwas allgemeineres wollen (z. B. auf Debian aufbauen, auf einer beliebigen Distribution bereitstellen), dann wird dies etwas trübe, je nachdem, was genau Ihre Abhängigkeiten sind.

Wenn Sie eine recht einfache Verteilung durchführen (dh Sie wissen, dass Ihre Build-Umgebung und Deploy-Umgebungen ähnlich sind), vermeidet dies den recht komplexen rpm/deb/ei/etc-Schritt (mit cx_Freeze ist es besonders einfach) wenn Sie mit py2exe vertraut sind). Wenn nicht, dann funktioniert alles von der Einrichtung Ihres eigenen Installationsprogramms bis hin zu deb/rpm/ego/etc. Das hängt davon ab, wie viel Arbeit Sie ausführen möchten, wie viel Flexibilität Sie mit den erforderlichen Versionen haben möchten und welche Abhängigkeiten bestehen.

0

Ich denke, Sie können relativ sicher Python-Unterstützung für die meisten modernen Linux-Distributionen - für diejenigen ohne es vorausgesetzt, solange eine vernünftige Fehlermeldung gegeben wird, sollten Benutzer wahrscheinlich in der Lage sein zu arbeiten, wie sie es selbst zu bekommen (Sie können dafür ein einfaches Bash-Start-Skript verwenden):

#!/bin/bash 
if [ -e /usr/bin/python ] 
then 
    echo "Python found!" 
else 
    echo "Python missing!" 
fi