Dateipfade OS übergreifend angeben

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
aitsch
User
Beiträge: 18
Registriert: Freitag 18. März 2022, 14:39

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

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.
aitsch
User
Beiträge: 18
Registriert: Freitag 18. März 2022, 14:39

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
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

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"))
Antworten