[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