Seite 1 von 1

Dateipfade OS übergreifend angeben

Verfasst: Samstag 23. April 2022, 16:08
von aitsch
Hallo zusammen,

mein Programm soll betriebssystemübergreifend (Win, Linux, MacOS) lauffähig sein.
Momentan habe ich die Icons für meine Buttons im gleichen Pfad abgelegt wie das Hauptprogramm.

Code: Alles auswählen

...
img_tab_close=tk.PhotoImage(file= r"cross.png")
...
Was die ganze Dateistruktur natürlich sehr unübersichtlich macht.

Nun sollen die Grafiken aber in das Unterverzeichnis 'images' umziehen.
Unter Windows haben wir ja den guten alten Bachslash '\'

Code: Alles auswählen

...
img_tab_close=tk.PhotoImage(file= r"..\images\cross.png")
...
und in *nix-Systemen den Slash '/'

Code: Alles auswählen

...
img_tab_close=tk.PhotoImage(file= r"../images/cross.png")
...

Wie geht man in Python damit um? Gibt es eine einheitliche Nomenklatur?

Gruß
aitsch

Re: Dateipfade OS übergreifend angeben

Verfasst: Samstag 23. April 2022, 16:12
von __deets__
Windows akzeptierst auch den /. Besser arbeitest du aber eh gleich mit pathlib. Und vor allem mit Pfaden, die du relativ zum __file__-Attribut deines Skriptes/Moduls auflöst. Denn das was du da mit relativen Pfaden machst, fällt dir auf die Füße, wenn der Benutzer nicht im korrekten Arbeitsverzeichnis steht.

Re: Dateipfade OS übergreifend angeben

Verfasst: Samstag 23. April 2022, 18:34
von aitsch
Danke für deine schnelle Antwort. Hier meine Umsetzung deiner Lösung:

Code: Alles auswählen

import os
from pathlib import Path

working_dir=Path(os.path.abspath(os.getcwd()))
image_dir=working_dir.joinpath('images')
print('working_dir is: %s' % working_dir)
print('image_dir is: %s' % image_dir)
funktioniert bestens

Re: Dateipfade OS übergreifend angeben

Verfasst: Samstag 23. April 2022, 18:51
von Sirius3
Nein, eben gerade nicht relativ zum aktuellen Arbeitsverzeichnis, sondern relativ zum Pfad, in dem die Pythondatei liegt.
Ansonsten ist die Benutzung von pathlib mit os auch sehr seltsam.
`working_dir` würde man so bestimmen:

Code: Alles auswählen

working_dir = Path().absolute()
image_dir = working_dir / 'images'
Du willst aber:

Code: Alles auswählen

BASE_PATH = Path(__file__).parent
IMAGE_PATH = BASE_PATH / 'images'
...
image_tab_close = tk.PhotoImage(file=str(IMAGE_PATH / "cross.png"))