2009-08-02 13 views
11

Robię niezależną od platformy aplikację PyQt. Zamierzam użyć zapisu plików setup.py za pomocą setuptools. Do tej pory udało mi się zdezintegrować platformę, np. załaduj konkretne opcje instalacji() w zależności od platformy, aby użyć py2exe na Windowsie ... itd ...Uzyskiwanie dostępu do plików danych przed i po distutils/setuptools

Jednak w mojej aplikacji rozpowszechniam niektóre motywy, HTML i obrazy, muszę załadować te obrazy w aplikacji w czasie wykonywania. Do tej pory są one przechowywane w katalogu themes/application.

Czytałem dokumentację na temat narzędzi setuptools i distutils i odkryłem, że jeśli dałem setup() opcje plików data_files ze wszystkimi plikami z katalogu/thems, które mają być zainstalowane w "share/MyApp/themes /" to byłby zainstalowany z/usr/prefix, lub cokolwiek sys.prefix jest na platformie. Zakładam, że znajdę pliki danych za pomocą os.path.join (sys.prefix, "share", "MyApp", "themes") nomatter na jakiej platformie jestem, prawda?

Jednakże, chcę mieć możliwość dostępu do plików danych również podczas programowania, gdzie znajdują się w katalogu themes/katalogu względem źródła aplikacji. Jak mam to zrobic? Czy jest jakiś sprytny sposób, aby dowiedzieć się, czy aplikacja została zainstalowana? A może narzędzie, które odwzorowuje pliki danych bez względu na to, gdzie się znajdują?

Naprawdę nienawidzę dodawać wszelkiego rodzaju brzydkich hacków, aby sprawdzić, czy istnieją motywy względne w stosunku do źródła lub w sys.prefix/share ... itd ... Jak znaleźć pliki danych podczas programowania? i po instalacji na dowolnej platformie?

Odpowiedz

5

Użyłem metody narzędziowy o nazwie data_file:

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

kładę to w pliku .py startowych w moim projekcie, a następnie połączyć go z dowolnego miejsca w moim pakiecie dostać plików krewnego do paczki.

Narzędzie Setupto ma podobną funkcję, ale nie wymaga to narzędzi setuptools.

+0

Jak to działa, gdy pliki data_files są zainstalowane w/usr/share/AppName/themes/ A mój plik wykonywalny jest w pliku/usr/lib/AppName, który zakładam ... Dokumentacja DistUtils mówi, że będzie Zainstalowany z sys.prefix jako przedrostek względnej ścieżki, którą dałem pliki danych, które mają być przechowywane w ... Pliki plików * nix systemy prawdopodobnie powinny być również w/usr/share/AppName/ – jonasfj

+1

użyłem tego z opcja package_data w pliku setup.py. Nie jestem pewien co do plików data_files. –

+0

Okay ... Tak, package_data jest również opcją ... Może powinienem iść z tym ... Po prostu nie sądzę, że to będzie generować pakiety zgodne z Debianem :) – jonasfj

7

można spróbować pkg_resources:

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

moje pliki danych zostaną zainstalowane w xx.egg root, podczas gdy ciąg zasobów próbuje je pobrać z __name__ (czarownica jest w "xxx.egg/package/subpackage"), więc zawsze kończy się niepowodzeniem. –

+0

@JensTimmerman: kliknij łącze: * "Argument resource_name jest interpretowany względem podanego pakietu" *. Więc jeśli twoje pliki są zainstalowane w katalogu pakietów xxx; użyj xxx zamiast "__name__" lub skonfiguruj, aby zainstalować pliki w katalogu podpakietów. – jfs

+0

cóż, są one zainstalowane w katalogu głównym jaja, więc domyślny katalog pakietów, ale przy użyciu pustego łańcucha nie działa. Po prostu nie wydaje się, żeby to było łatwiejsze, jeśli muszę je skonfigurować, aby zainstalować je zaraz obok źródła ... –

Powiązane problemy