2009-08-02 4 views
11

Ich mache eine plattformunabhängige PyQt-Anwendung. Ich beabsichtige, setup.py Dateien mit setuptools zu schreiben. Bis jetzt ist es mir gelungen, die Plattform, z. lade spezifische Optionen für Setup() abhängig von der Plattform, um py2exe unter Windows zu verwenden ... etc ...Zugriff auf Datendateien vor und nach distutils/setuptools

Allerdings, mit meiner Anwendung verteile ich einige Themen, HTML und Bilder, muss ich diese Bilder laden in der Anwendung zur Laufzeit. Bisher sind sie im themes/-Verzeichnis der Anwendung gespeichert.

Ich habe Dokumentation über setuptools und distutils gelesen, und herausgefunden, dass wenn ich setup() die data_files Optionen mit allen Dateien in den Themes/Verzeichnis in "share/MyApp/themes /" installiert werden soll würde mit einem/usr/Präfix installiert werden, oder was auch immer sys.prefix auf der Plattform ist. Ich nehme an, dass ich die Datendateien mit os.path.join (sys.prefix, "share", "MyApp", "themes") finden würde, egal, auf welcher Plattform ich bin, oder?

Ich möchte jedoch auch während der Entwicklung auf die Datendateien zugreifen können, wo sie sich im themes/Verzeichnis relativ zur Anwendungsquelle befinden. Wie mache ich das? Gibt es eine kluge Möglichkeit, herauszufinden, ob die Anwendung installiert wurde? Oder ein Dienstprogramm, das den Datendateien zuordnet, unabhängig davon, wo sie sich gerade befinden?

Ich würde wirklich hassen, alle Arten von hässlichen Hacks hinzuzufügen, um zu sehen, ob es Themen relativ zur Quelle gibt, oder in sys.prefix/share ... etc ... Wie finde ich dort Datendateien während der Entwicklung? und nach der Installation auf einer beliebigen Plattform?

def data_file(fname): 
    """Return the path to a data file of ours.""" 
    return os.path.join(os.path.split(__file__)[0], fname) 

Ich habe dies in der init Py-Datei in meinem Projekt, und es dann von überall in meinem Paket rufe eine Datei relativ zu bekommen:

Antwort

5

Ich habe eine Dienstprogramm Methode namens data_file verwendet zum Paket.

Setuptools bietet eine ähnliche Funktion, benötigt aber keine setuptools.

+0

Wie funktioniert das, wenn data_files in/usr/share/AppName/themes/ installiert sind? Und meine ausführbare Datei ist in etwas wie/usr/lib/AppName Ich würde annehmen ... DistUtils Dokumentation sagt, es wird installiert mit dem sys.prefix als Präfix für den relativen Pfad, dem ich die Datendateien gab, die in ... gespeichert werden sollten. On * nix systems Datendateien sollten sich wahrscheinlich auch in/usr/share/AppName/ – jonasfj

+1

befinden, mit dem ich das verwendet habe Eine Paketdatenoption in setup.py. Nicht sicher über data_files. –

+0

Okay ... Ja, package_data ist auch eine Option ... Vielleicht sollte ich damit gehen ... Ich denke nur nicht, dass es Debian-kompatible Pakete erzeugen wird :) – jonasfj

7

Sie könnten pkg_resources versuchen:

my_data = pkg_resources.resource_string(__name__, fname) 
+0

meine Datendateien werden im xx.egg installiert root, während resource string versucht, sie von __name__ (witch ist in 'xxx.egg/package/subpackage') zu bekommen, so dass es immer fehlschlägt. –

+0

@JensTimmerman: Klicken Sie auf den Link: * "Das Argument resource_name wird relativ zum benannten Paket interpretiert" *. Also, wenn Ihre Dateien im Paketverzeichnis von xxx installiert sind; Verwenden Sie xxx anstelle von '__name__' oder konfigurieren Sie, um die Dateien im Verzeichnis des Unterpakets zu installieren. – jfs

+0

Nun, sie sind in der Wurzel des Eies installiert, so dass das Standard-Paket-Verzeichnis, aber mit einer leeren Zeichenfolge funktioniert nicht. Es scheint einfach nicht die Dinge zu vereinfachen, wenn ich es so konfigurieren muss, dass es direkt neben der Quelle installiert wird ... –

Verwandte Themen