Portabel $TMPDIR herausfinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gotridofmyphone
User
Beiträge: 33
Registriert: Mittwoch 15. März 2017, 08:54

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14012
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
gotridofmyphone
User
Beiträge: 33
Registriert: Mittwoch 15. März 2017, 08:54

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. :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
gotridofmyphone
User
Beiträge: 33
Registriert: Mittwoch 15. März 2017, 08:54

Danke, tempfile.gettempdir() muss ich übersehen haben, genau danach hab ich gesucht. Die Dokumentation von dieser Funktion war für mich recht irreführend.
Antworten