Angabe von relativen Pfaden bei verschachtelten Modulen?

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
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

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.
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*.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

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?
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.
Antworten