Seite 1 von 1

Angabe von relativen Pfaden bei verschachtelten Modulen?

Verfasst: Dienstag 21. Mai 2013, 11:11
von ichbinsisyphos
Ich hab hier ein Problem in PyQt4, ist aber wohl kaum Qt-spezifisch ... wie erklär ich das verständlich ...

Ich hab ein Programm, in dem ich ein selbstgeschriebenes Modul einbinde. Das Modul ist als Verzeichnis (im Ordner des Hauptprogramms) mit __init__.py-Skrip angelegt, in dem alle Teilskripte importiert werden. Das kann ich im Programm mit

Code: Alles auswählen

import <verzeichnisname>
bzw

Code: Alles auswählen

import <verzeichnisname>.Teilmodul
verwenden.

So, in diesem Verzeichnis ist ein Ordner "icons" in dem die Grafiken für Buttons etc sind.

Wenn das einigermaßen klar ist, komm ich jetzt zum Problem: ich kann im Modul die Grafiken nicht von "./icons/<filename.png>" laden, sondern muss "<verzeichnis>/icons/<filename.png>" angeben, d.h. der Pfad wird relativ zum Hauptprogramm verstanden und nicht relativ zu dem Skript in dem die Grafik eigentlich geladen wird. Kann ich irgendwas dagegen machen? Das ist nämlich furchtbar unpraktisch.

Re: Angabe von relativen Pfaden bei verschachtelten Modulen?

Verfasst: Dienstag 21. Mai 2013, 11:32
von BlackJack
@ichbinsisyphos: Der Pfad wird relativ zum Arbeitsverzeichnis des Prozesses verstanden, wo auch immer dieses liegt. Üblicherweise legt der Aufrufer das fest, denn es wird *dessen* aktuelles Arbeitsverzeichnis vom neuen Prozess übernommen.

Den Pfad zu einem Modul kannst Du über den Namen/das Attribut `__file__` herausfinden. Diesen Namen gibt es in jedem Modul und mit der passenden Funktion aus `os.path` kannst Du den Dateinamen entfernen und das Icons-Unterverzeichnis dran hängen.

Ein Modul als Verzeichnis mit einer ``__init__.py`` heisst übrigens *Package*.

Re: Angabe von relativen Pfaden bei verschachtelten Modulen?

Verfasst: Dienstag 21. Mai 2013, 11:49
von /me
BlackJack hat geschrieben:Den Pfad zu einem Modul kannst Du über den Namen/das Attribut `__file__` herausfinden. Diesen Namen gibt es in jedem Modul und mit der passenden Funktion aus `os.path` kannst Du den Dateinamen entfernen und das Icons-Unterverzeichnis dran hängen.
Um es konkreter zu machen: Du brauchst os.path.dirname für den Verzeichnisnamen und os.path.join um das 'icons' anzuhängen.

Re: Angabe von relativen Pfaden bei verschachtelten Modulen?

Verfasst: Dienstag 21. Mai 2013, 12:20
von ichbinsisyphos
Ja, danke. Ich hab das mal gemacht, kommt mir aber wie ein hack vor. Wie verwendet man am geschicktesten icons? Nur so? Oder irgendwo in /usr/share mit absoluten Pfaden?

Re: Angabe von relativen Pfaden bei verschachtelten Modulen?

Verfasst: Dienstag 21. Mai 2013, 13:00
von BlackJack
@ichbinsisyphos: Das ist die einfachste und eine plattformunabhängige Methode. Unter Linux könnte man zum Beispiel dem Freedesktop-Standard folgen. Das funktioniert dann aber nicht unter Windows und man muss entweder selber etwas programmieren oder etwas externes verwenden.