2009-02-01 14 views
9

Momentan benutze ich die Auto-Tools, um ein Projekt von mir zu bauen/zu installieren und zu packen, aber ich würde wirklich gerne etwas bewegen, das sich mehr "pythonisch" anfühlt.Wie verteilt man `.desktop` Dateien und Icons für ein Python-Paket in Gnome (mit Distutils oder Setuptools)?

Mein Projekt besteht aus zwei Skripten, einem Modul, zwei Glade-GUI-Beschreibungen und zwei .desktop-Dateien. Es ist derzeit ein reines Python-Projekt, obwohl sich das wahrscheinlich bald ändern wird.

Mit setuptools kann ich leicht sehen, wie man mit allem außer den .desktop-Dateien umgeht; Sie müssen in einem bestimmten Verzeichnis landen, damit Gnome sie finden kann.

Ist die Verwendung von distuils/setuptools eine gute Idee, um damit zu beginnen?

Antwort

4

Ich schaffte es, dies zur Arbeit zu bringen, aber es fühlt sich für mich eher wie ein Workaround.

from setuptools import setup 

setup(
    # ... 
    data_files=[ 
    ('share/icons/hicolor/scalable/apps', ['data/mypackage.svg']), 
    ('share/applications', ['data/mypackage.desktop']) 
    ], 
    entry_points={ 
    'console_scripts': ['startit=mypackage.cli:run'] 
    } 
) 

Der Starter-Skript Trog entry_points Werke:

Sie wissen nicht, was die bevorzugte Art und Weise ist die ...

ich folgende setup.py Datei (Vollversion ist here) verwendet zu behandeln. Aber die data_files wurden in eine Eildatei und nicht in die angegebenen Ordner, so dass sie nicht von der Desktop-Shell zugegriffen werden können.

Um dies zu umgehen, habe ich die folgende setup.cfg Datei:

[install] 
single-version-externally-managed=1 
record=install.txt 

Dies funktioniert. Beide Datendateien werden an der richtigen Stelle erstellt und die Datei .desktop wird von Gnome erkannt.

+1

Dies ist ein guter Anfang, funktioniert aber nicht mit --user, da/usr/bin für Exec in der .desktop-Datei fest programmiert werden muss . Du kannst den Pfad weglassen, aber dann muss er im $ PATH der Desktop-Umgebung sein, was ~/.local/bin im Allgemeinen nicht ist. Beachten Sie auch, dass --single-version-extern-managed mit pip nicht benötigt wird, da es keine Eier verwendet. – jwelsh

1

Im Allgemeinen, ja - alles ist besser als Autotools beim Erstellen von Python-Projekten.

Ich habe bisher gute Erfahrungen mit setuptools gemacht. Das Installieren von Dateien an festen Speicherorten ist jedoch keine Stärke von setuptools - schließlich ist es nichts, Installer für Python-Apps zu erstellen, sondern Python-Bibliotheken zu verteilen.

Für die Installation von Dateien, die keine Anwendungsdatendateien (wie Bilder, UI-Dateien usw.) sind, aber eine Integration in das Betriebssystem ermöglichen, ist die Verwendung eines echten Verpackungsformats (wie RPM oder DEB) besser.

Nichts davon hält Sie davon ab, den Build-Prozess auf setuptools und eine kleine make-Datei für die Installation alles an seinem rechtmäßigen Ort.

+0

Also, sagst du, dass es nichts Pythonic für den Aufbau/die Verpackung Anwendungen in Python geschrieben gibt? Das ist ein bisschen enttäuschend. – Magnus

+1

Verpackungsanwendungen hängen vom Betriebssystem ab, nicht von der Programmiersprache. Ein Anwendungspaket (mit Installer usw.) unter Windows muss andere Anforderungen erfüllen als ein .deb-Paket oder eine Mac OS X-App. –

+0

Die Verpackung für ein Betriebssystem wird durch die Wahl einer guten Build-Umgebung erheblich vereinfacht. Viele Build-Umgebungen sind auch doppelt so einfache Packagesysteme, oft nur Quellen, z. Auto-Tools, Distutils, Ruby Edelsteine, ... vielleicht ist "Distributionssystem" ein besserer Begriff. – Magnus

1

Sie können versuchen, python-distutils-extra zu verwenden. Das DistUtilsExtra.auto Modul automatisch supports .desktop-Dateien sowie Glade/GtkBuilder .ui Dateien, Python-Module und Skripte, sonstige Datendateien usw.

Es sollte beide arbeiten mit Distutils und Setuptools.

1

Ich habe https://pypi.python.org/pypi/install-freedesktop erstellt. Es erstellt .desktop-Dateien automatisch für die gui_scripts-Einstiegspunkte, die über ein Setup-Argument angepasst werden können, und unterstützt --user sowie die systemweite Installation.Im Vergleich zu DistUtilsExtra ist es enger im Umfang und IMHO mehr pythonisch (explizit ist besser als implizit).