2009-08-02 7 views
11

Sto facendo un'applicazione PyQt indipendente dalla piattaforma. Intendo usare scrivere un file setup.py usando setuptools. Finora sono riuscito a scoprire la piattaforma, ad es. caricare opzioni specifiche per setup() a seconda della piattaforma per utilizzare py2exe su Windows ... ecc ...Accesso ai file di dati prima e dopo distutils/setuptools

Tuttavia, con la mia applicazione sto distribuendo alcuni temi, HTML e immagini, ho bisogno di caricare queste immagini nell'applicazione in fase di esecuzione. Finora sono memorizzati nella directory themes/dell'applicazione.

Ho letto documentazione su setuptools e distutils e ho capito che se fornivo setup() le opzioni data_files con tutti i file nella directory themes/da installare in "share/MyApp/themes /" verrebbe installato con un prefisso/usr/o qualsiasi altro sys.prefix si trovi sulla piattaforma. Suppongo che troverei i file di dati usando os.path.join (sys.prefix, "share", "MyApp", "themes") nomatterò su quale piattaforma sono attivo, giusto?

Tuttavia, desidero poter accedere ai file di dati anche durante lo sviluppo, dove risiedono nella directory temi/relativa alla sorgente dell'applicazione. Come faccio a fare questo? C'è un modo intelligente per capire se l'applicazione è stata installata? O un'utilità che si associa ai file di dati indipendentemente da dove si trovino, al momento?

Vorrei davvero odiare tutti i tipi di brutti hack per vedere se ci sono temi relativi all'origine, o in sys.prefix/share ... ecc ... Come trovo i file di dati durante lo sviluppo? e dopo l'installazione su una piattaforma arbitraria?

risposta

5

ho usato un metodo utility chiamata 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) 

Ho messo questo nel file .py init nel mio progetto, e quindi chiamare da qualsiasi luogo nel mio pacchetto per ottenere un file relativo al pacchetto.

Setuptools offre una funzione simile, ma questo non ha bisogno di setuptools.

+0

Come sarà questo lavoro quando data_files sono installati in/usr/share/NomeApp/themes/ E il mio eseguibile è in qualcosa come/usr/lib/NomeApp Mi piacerebbe pensare ... distutils documentazione dice che sarà installato con sys.prefix come prefisso per il percorso relativo che ho dato ai file di dati da memorizzare in ... Su * nix i file di dati dei sistemi dovrebbero probabilmente anche essere in/usr/share/AppName/ – jonasfj

+1

Ho usato questo con un'opzione package_data in setup.py. Non sono sicuro di data_files. –

+0

Okay ... Sì, package_data è anche un'opzione ... Forse dovrei andare con quello ... Non penso che genererà pacchetti compatibili con Debian :) – jonasfj

7

Si potrebbe provare pkg_resources:

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

i miei file di dati vengono installati nella xx.egg root, mentre la stringa di risorse prova a recuperarli da __name__ (witch è in 'xxx.egg/package/subpackage'), quindi fallisce sempre. –

+0

@JensTimmerman: fare clic sul collegamento: * "l'argomento resource_name viene interpretato in relazione al pacchetto denominato" *. Quindi se i tuoi file sono installati nella directory del pacchetto di xxx; usa xxx invece di '__name__' o configura per installare i file nella directory del subpackage. – jfs

+0

beh, sono installati nella radice dell'uovo, quindi la directory del pacchetto predefinita, ma l'utilizzo di una stringa vuota non funziona. Semplicemente non sembra rendere le cose più facili se devo configurarlo per essere installato proprio accanto alla sorgente comunque ... –