2014-06-10 14 views
7

Ich schreibe gerade eine Kommandozeilen-Anwendung in Python, die den Endbenutzern so zur Verfügung gestellt werden muss, dass sie sehr einfach heruntergeladen und ausgeführt werden kann. Für diejenigen unter Windows, die Python (2.7) nicht installiert haben, beabsichtige ich, PyInstaller zu verwenden, um eine in sich geschlossene Windows-Programmdatei zu erzeugen. Benutzer können dann einfach "myapp.exe" herunterladen und myapp.exe [ARGUMENTS] ausführen.Verpacken Sie eine Befehlszeilenanwendung für die Verteilung?

Ich möchte auch einen (kleineren) Download für Benutzer (auf verschiedenen Plattformen), die bereits Python installiert haben. Eine Möglichkeit besteht darin, meinen gesamten Code in eine einzige .py-Datei "myapp.py" (beginnend mit #! /usr/bin/env python) zu schreiben und diese zur Verfügung zu stellen. Dieser könnte heruntergeladen werden und dann unter Verwendung von myapp.py [ARGUMENTS] oder python myapp.py [ARGUMENTS] ausgeführt werden. Die Beschränkung meiner Anwendung auf eine einzelne .py-Datei hat jedoch einige Nachteile, einschließlich der Einschränkung meiner Fähigkeit, den Code zu organisieren und die Verwendung von Abhängigkeiten von Drittanbietern zu erschweren.

Stattdessen möchte ich den Inhalt mehrerer Dateien meines eigenen Codes, plus einige (reine Python) Abhängigkeiten verteilen. Gibt es irgendwelche Werkzeuge, die all dies in eine einzige Datei packen können, die einfach heruntergeladen und mit einer bestehenden Python-Installation ausgeführt werden kann?

Edit: Bitte beachte, dass ich diese Anwendungen benötigen für Endanwender laufen einfach zu sein. Es ist unwahrscheinlich, dass sie pip oder irgendetwas anderes, das außerhalb des Python-Kerns liegt, installiert haben. Mit PyInstaller kann ich eine Datei generieren, die diese Benutzer aus dem Internet herunterladen und mit einem Befehl ausführen können (oder, wenn keine Argumente vorhanden sind, einfach durch Doppelklicken). Gibt es eine Möglichkeit, diese Benutzerfreundlichkeit zu erreichen, ohne PyInstaller zu verwenden (d. H. Ohne die Python-Laufzeit redundant zu bündeln)?

+3

für die zweite (kleine) Lösung, warum nicht Pip verwenden? –

+0

Sie haben sehr ähnliche Fragen [hier über Windows] (http://stackoverflow.com/questions/2136837/process-to-convert-simple-python-script-into-windows-executable?rq=1) und [hier in allgemein] (http://stackoverflow.com/questions/7156333/packaging-a-python-application?rq=1) – logc

+0

Sie erwähnen verschiedene Plattformen, aber erwähnen Sie nicht, was sie sind. Ist "sudo apt-get install package" einfach genug für Ihre Endbenutzer? – berto

Antwort

5

Sie könnten Pip verwenden, wie in den Kommentaren vorgeschlagen. Sie müssen MANIFEST.in und setup.py in Ihrem Projekt erstellen, um es installierbar zu machen. Sie können auch Module als Voraussetzungen hinzufügen.

How do I package a python application to make it pip-installable?

Dies Ihr Modul in Python verfügbar machen: Mehr Informationen können in dieser Frage (nicht spezifisch für Django) gefunden werden. Sie können dann Benutzer eine Datei ausführen lassen, die Ihr Modul ausgeführt wird, entweder python path/run.py, ./path/run.py (mit +x Erlaubnis) oder python -c "some code here" (z. B. für einen Alias).

Sie können auch Benutzer von einem git öffentlichen reporitory installieren, wie diese

pip install git+https://bitbucket.org/yourname/projectname.git 

... in diesem Fall werden sie brauchen git auch.

+1

Sie können auch einen Tarball der Anwendung mit Pip installieren; Dies beseitigt die Git-Anforderung. Zum Beispiel: 'pip install https: // yourdomain.com/application.tar.gz' – berto

7

Ich mag die Idee der einzelnen Datei nicht, weil es eine Wartungslast wird. Ich würde einen Ansatz wie den folgenden untersuchen.

Ich bin ein großer Fan von Pythons virtuellen Umgebungen geworden, weil Sie damit Ihre Anwendungsabhängigkeiten von der Installation des Betriebssystems trennen können. Stellen Sie sich ein Szenario vor, in dem die Anwendung, die Sie gerade verteilen möchten, ein Python-Paket requests v1.0 verwendet. Einige Zeit später erstellen Sie eine andere Anwendung, die Sie verwenden möchten, die requests v2.3 verwendet. Es kann zu Versionskonflikten auf einem System kommen, auf dem Sie beide Anwendungen nebeneinander installieren möchten. Virtuelle Umgebungen lösen dieses Problem, da jede Anwendung über einen eigenen Speicherort verfügt.

Erstellen einer virtuellen Umgebung ist einfach. Sobald Sie virtualenv installiert haben, ist es einfach eine Frage der Ausführung, z. B. virtualenv /opt/application/env.Jetzt haben Sie eine isolierte Python-Umgebung für Ihre Anwendung. Darüber hinaus sind virtuelle Umgebungen sehr einfach zu bereinigen, entfernen Sie einfach das Verzeichnis env und Sie sind fertig.

Sie benötigen eine setup.py Datei, um Ihre Anwendung in der Umgebung zu installieren. Angenommen, Ihre Anwendung verwendet requests v2.3.0, Ihr benutzerdefinierter Code befindet sich in einem Paket mit der Bezeichnung acme und Ihr Skript heißt phone_home. Verzeichnisstruktur sieht wie folgt aus:

acme/ 
    __init__.py 
    models.py 
    actions.py 
scripts/ 
    phone_home 
setup.py 

Die setup.py etwas würde wie folgt aussehen:

from distutils.core import setup 


install_requires = [ 
    'requests==2.3.0', 
] 

setup(name='phone_home', 
     version='0.0.1', 
     description='Sample application to phone home', 
     author='John Doe', 
     author_email='[email protected]', 
     packages=['acme'], 
     scripts=['scripts/phone_home'], 
     url='http://acme.com/phone_home', 
     install_requires=install_requires, 
) 

Sie jetzt einen Tarball aus Ihrem Projekt machen können und Host es wie Sie wollen (Ihre eigenen Web-Server , S3, etc.):

tar cvzf phone_home-0.0.1.tar.gz . 

Schließlich können Sie pip verwenden Ihr Paket in der virtuellen Umgebung zu installieren, die Sie erstellt:

/opt/application/env/bin/pip install http://acme.com/phone_home-0.0.1.tar.gz 

können Sie dann laufen phone_home mit:

/opt/application/env/bin/phone_home 

Oder einen Symlink in/usr/local/bin erstellen Sie einfach das Skript aufrufen phone_home mit:

ln -s /opt/application/env/bin/phone_home /usr/local/bin/phone_home 

All das Die obigen Schritte können in ein Shell-Skript eingefügt werden, das den Prozess zu einer Einzelbefehlsinstallation macht.

Und mit leichten Modifikationen funktioniert dieser Ansatz sehr gut für Entwicklungsumgebungen; d. h. Verwenden von pip zum Installieren/Referenzieren Ihres Entwicklungsverzeichnisses: pip install -e . Dabei bezieht sich . auf das aktuelle Verzeichnis und Sie sollten sich in Ihrem Projektverzeichnis neben setup.py befinden.

Hoffe, das hilft!

Verwandte Themen