Seite 1 von 1
Portabel $TMPDIR herausfinden
Verfasst: Freitag 1. Februar 2019, 22:28
von gotridofmyphone
Hallo,
ich weiß, wie man in Python temporäre Dateien und Verzeichnisse anlegt und nutzt und am Ende wieder löschen lassen kann. Das möchte ich aber nicht. Sondern ich möchte herausfinden, ob es ein temporäres Verzeichnis vom vorigen Lauf des Programms gibt, das nicht gelöscht wurde, um es nachzunutzen, so dass ich bereits berechnete Töne nicht unnötig neuberechnen muss? Wie mache ich das?
In Bash ist die äquivalente Anweisung:
Code: Alles auswählen
find -L ${tempdir} -wholename "${tempdir}/sompyler*/score" -samefile "${score_path}" 2> /dev/null | head -1
Mit glob.glob und os.walk und os.readlink kann ich 80% der Aufgabe abdecken, aber wie finde ich heraus, wo tempdir eine neue temporäre Datei anlegen würde? Muss ich ein temp. Verzeichnis anlegen, dirname(temppath) ermitteln, und wieder löschen? Das ist bestimmt nicht der
pythonic way to do things. Gibt es eine elegantere Lösung?
Viele Grüße
gotridofmyphone
Re: Portabel $TMPDIR herausfinden
Verfasst: Freitag 1. Februar 2019, 22:32
von __deets__
Da du ein permanentes Verzeichnis suchst, und kein temporaeres, ist das Modul tempfile halt nicht das richtige Mittel. Der Standardweg unter Linux ist die Anlage eines ~/.<meinprogramm>/ Verzeichnisses, ggf. mit Unterstruktur fuer Konfiguration und caching etc.
Re: Portabel $TMPDIR herausfinden
Verfasst: Samstag 2. Februar 2019, 00:09
von __blackjack__
Unter Linux würde ich für einen Cache schauen ob es die Umgebungsvariable $XDG_CACHE_HOME gibt und falls nicht ~/.cache annehmen und dort ein Unterverzeichnis für mein Programm anlegen.
Edit: Und siehe da, es gibt dafür auch schon ein Modul:
https://pypi.org/project/xdg/
Modulbeschreibung:
xdg is a tiny Python module which provides the variables defined by the XDG Base Directory Specification, to save you from duplicating the same snippet of logic in every Python utility you write that deals with user cache, configuration, or data files. It has no external dependencies.
Re: Portabel $TMPDIR herausfinden
Verfasst: Samstag 2. Februar 2019, 15:24
von gotridofmyphone
XDG-Cache ist nicht portabel. Windows z.B. bleibt da außen vor, oder? Gibt es keine portable Caching-Lösung, so dass ich mich auch nicht um Expiration kümmern muss? Temporäre Daten haben den Vorteil, dass sie gewöhnlich automatisch systemseitig bereinigt werden. Daher sehe ich Caches im Benutzerverzeichnis eher für wirklich vorrangig persistente Daten geeignet, die nicht nur dadurch megabyteweise verfallen können, dass ich etwa an den Instrumentdaten ein Byte ändere.
Das Programm unterstützt bereits, dass man ein temporäres oder Cache-Verzeichnis angeben kann, statt einer Score-Datei, die wird dann über den score-Symlink in diesem Verzeichnis gefunden. In einem nächsten Schritt soll, selbst wenn eine Score-Datei angegeben wird, ein ggf. vorhandener Cache gesucht werden unter allen in Frage kommenden Verzeichnissen, ich das mit Bashmitteln kann, s.o.
Danke für eure Hilfe, dann werde ich aber lieber den weniger eleganten Weg beschreiten: Temporäres Verzeichnis auf jeden Fall erst mal anlegen, erst dann schauen, ob es in dem gleichen übergeordneten Verzeichnis eines gibt, dessen ./score-Verknüpfung auf dieselbe Datei verweist. Und dann das umsonst angelegte neue Verzeichnis wieder löschen, die Variable mit dem Pfad zu diesem entsprechend ändern, und gut.

Re: Portabel $TMPDIR herausfinden
Verfasst: Samstag 2. Februar 2019, 15:31
von __deets__
Du machst dir das Leben gerne kompliziert, oder? Wenn du ok damit bist, dass dieses Verzeichnis nicht immer da ist, sondern zB beim systemstart wegfaellt, dann nimm dir das System-eigene temp-Verzeichnis mit tempfile.gettempdir() her, und nimm ein festes Verzeichnis darunter, also
os.path.join(tempfile.gettempdir(), "sompyler")
und gut ist.
Re: Portabel $TMPDIR herausfinden
Verfasst: Samstag 2. Februar 2019, 15:34
von gotridofmyphone
Danke, tempfile.gettempdir() muss ich übersehen haben, genau danach hab ich gesucht. Die Dokumentation von dieser Funktion war für mich recht irreführend.