[python-users] default config file erzeugen / mit installieren / vernünftig ablegen
Christopher Arndt
chris at chrisarndt.de
Di Mär 4 19:39:33 CET 2014
Hallo Henning, hallo Thomas, hallo allerseits,
Am 04.03.2014 18:54, schrieb Thomas Koch:
> für das Home-Verzeichnis ist vermutlich
>
>>>> os.path.expanduser("~")
>
> 'C:\\Users\\koch'
>
> die schlankere Variante.
ich finde, das sollte kein modernes Programm mehr machen, es sein denn,
es soll auch unter archaischen Unix-Varianten laufen. Ich finde es nicht
die feine Art, wenn mir alle möglichen Programme mein Home-Verzeichnis
zumüllen, und genau dafür gibt es ja die entspr. XDG-Standards.
> Hier bin ich auch für Lösungen offen, bei denen ich keine zusätzliche
> Abhängigkeit brauche.
Es gibt für die versch. XDG-Standards bereits fertige
Python-Implementierungen. Warum das Rad neu erfinden?
Wenn man es richtig machen wollte, sollte man sich allerdings auch an
die Standards in der Windows und OS X Welt halten. Ich kenne allerdings
kein Programm, welches das ordentlich macht. Die plattformübergreifenden
Frameworks wie z.B. Qt oder wxWindows haben meist ihre eigenen
Konventionen und Libraries für das Konfigurationshandling.
Ich habe mal ein Cookbook Recipe zum Finden entspr. Pfade auf Windows
geschrieben. Inwieweit das noch auf die Gepflogenheiten seit Windows 7
passt, kann ich aber nicht sagen.
http://code.activestate.com/recipes/473846-get-systemlanguageuser-dependent-paths-on-windows/
Falls jemand eine Pythonbibliothek kennt, die diese ganzen
Konfigurationspfade plattformübergreifend und standardkonform ermittelt,
wäre ich auch sehr daran interessiert.
> - Alternativ könnte man auch die Config beim ersten Start eines
> Programms erzeugen lassen. /
>
> Das ist eigentlich auch nicht unüblich.
Ja, es gibt eine Zillion Programme, die das so macht. Es ist m.E. auch
besser als eine zentrale Konfigdatei, die schon bei der Installation
erstellt werden und beim Start des Programms vorhanden sein muss
(Stichwort Application Bundles und Relocateable Apps).
Eine Alternative zum automatischen Erzeugen eines Konfigurationsfiles
wäre eine Kommandozeilenoption, um eine Defaultkonfiguration auf
Standardout auszuspucken.
> Gibt es hier die Möglichkeit, dass z.B. eine
> my_project.conf.default in /usr/local/share/ (o.ä.) liegt, die genau
> dorthin beim Setup kopiert wird?/
Diese Möglichkeit gibt es in distutils, das würde ich aber nicht
empfehlen, da man dann Root-Rechte braucht, um das Paket zu installieren.
http://docs.python.org/2/distutils/setupscript.html#installing-additional-files
Besser ist, wie von Thomas schon vorgeschlagen, die Datei einfach mit in
dein Python Package zu, äh, packen.
http://docs.python.org/2/distutils/setupscript.html#installing-package-data
bzw. komfortabler mit setuptools:
http://pythonhosted.org//setuptools/setuptools.html#including-data-files
Darauf zugreifen sollte man dann aber mit dem pkg_resources aus
setuptools oder pkgutil.get_data() aus der Standardlib, damit es auch
mit gezippten Packages funktioniert und generell dem (erweiterbaren)
Python Importprotokoll entspricht.
http://docs.python.org/2/library/pkgutil.html#pkgutil.get_data
Falls du das nicht willst, gibt es mit setuptools/pkg_resources auch
noch eine Möglichkeit, Dateien mit in ein Egg aber nicht in ein Python
Package zu packen:
http://pythonhosted.org//setuptools/setuptools.html#non-package-data-files
Ob das auch mit Wheels geht, und ob das im Zusammenhang mit pip
funktioniert, weiß ich nicht.
> - Ein post-install skript konnte ich bisher nur erzwingen, indem ich die
> "install"-Methode von setuptools überladen habe und weiteren Kram
> ausführen lasse. Dies finde ich jedoch relativ hässlich. Gibt es hierfür
> bereits Hausmittel in der Standard Library?
Wie gesagt, das würde ich sowieso nicht empfehlen, aber ich habe
letztens bei der PyCologne in einem kurzen Talk vorgestellt, wie man in
setup.py eigene setup Kommandos einbindet:
http://trac.chrisarndt.de/code/wiki/distutils-extend
Über setup.cfg kann man dann ein Kommando-Alias definieren, das
'install' und das eigene Kommando in einem Rutsch aufruft.
Chris
Mehr Informationen über die Mailingliste python-users