2009-12-21 17 views
10

Ho trovato una soluzione per aggiungere file in library.zip tramite: Extend py2exe to copy files to the zipfile where pkg_resources can load them.Py2exe: incorporare file statici nel file exe stesso e accedervi

Posso accedere al mio file quando library.zip non include l'exe.

Aggiungo un file: text.txt nella directory: foo/media in library.zip. e io uso questo codice:

import pkg_resources 
import zipfile 
from cStringIO import StringIO 

my_data = pkg_resources.resource_string(__name__,"library.zip") 

filezip = StringIO(my_data) 
zip = zipfile.ZipFile(filezip) 
data = zip.read("foo/media/text.txt") 

cerco di usare pkg_resources ma penso che non capisco qualcosa perché ho potuto aprire direttamente "library.zip".

La mia domanda è come posso fare questo quando library.zip è incorporato in exe?

migliori saluti

Jean-Michel

risposta

0

Non dovrebbe usare pkg_resources per recuperare il file library.zip. Dovresti usarlo per recuperare la risorsa aggiunta.

Supponiamo di avere la seguente struttura del progetto:

setup.py 
foo/ 
    __init__.py 
    bar.py 
    media/ 
     image.jpg 

usereste resource_string (o, preferibilmente, resource_stream) per accedere image.jpg:

img = pkg_resources.resource_string(__name__, 'media/image.jpg') 

Questo dovrebbe "solo lavoro". Almeno lo ha fatto quando ho raggruppato i miei file multimediali nel file EXE. (Scusate, da allora ho lasciato l'azienda dove stavo usando py2exe, quindi non ho un esempio funzionante per disegnare.)

Si potrebbe anche provare a utilizzare pkg_resources.resource_filename(), ma non credo che funziona con py2exe.

1

Grazie, ma ho trovato la soluzione

my_data = pkg_resources.resource_stream("__main__",sys.executable) # get lib.zip file 
zip = zipfile.ZipFile(my_data) 
data = zip.read("foo/media/doc.pdf") # get my data on lib.zip 
file = open(output_name, 'wb') 
file.write(data) # write it on a file 
file.close() 

migliori saluti

10

ho messo insieme una soluzione ragionevolmente pulito per questo, ma non usa pkg_resources.

Devo distribuire gli strumenti di produttività come file EXE autonomi, ovvero tutti raggruppati in un unico file .exe. Devo anche inviare notifiche quando questi strumenti vengono utilizzati, cosa che faccio tramite l'API di registrazione, utilizzando la configurazione basata su file. Ho eliminato il file log logging.cfg rendendo più difficile disattivare in modo efficace queste notifiche, eliminando il file in errore ... il che probabilmente interromperà comunque l'app.

Così il seguente è il bit interessanti dal mio setup.py:

LOGGING_CFG = open('main/resources/logging.cfg').read() 

setup(
    name='productivity-tool', 
    ... 

    # py2exe extras 
    console=[{'script': productivity_tool.__file__.replace('.pyc', '.py'), 
       'other_resources': [(u'LOGGINGCFG', 1, LOGGING_CFG)]}], 
    zipfile=None, 
    options={'py2exe': {'bundle_files': 1, 'dll_excludes': ['w9xpopen.exe']}}, 
) 

Poi nel codice di avvio per productivity_tool.py:

from win32api import LoadResource 
from StringIO import StringIO 
from logging.config import fileConfig 
... 

if __name__ == '__main__': 
    if is_exe(): 
     logging_cfg = StringIO(LoadResource(0, u'LOGGINGCFG', 1)) 
    else: 
     logging_cfg = 'main/resources/logging.cfg' 
    fileConfig(logging_cfg) 
    ... 

funziona a meraviglia !!!

+0

Soluzione pulita! L'ho usato e funziona benissimo! – foresightyj

+0

Funzionerebbe su file PNG? Sto per provarlo, ma se sai che sarei grato di saperlo. –

+0

Ok, ci sono alcuni problemi di formattazione dei file, perché pensavo che avrei esaminato quelli, ma a parte questo dovrebbe funzionare, giusto? –

Problemi correlati