2009-12-21 16 views
10

Encontré una solución para agregar archivos en library.zip a través de: Extend py2exe to copy files to the zipfile where pkg_resources can load them.Py2exe: incrustar archivos estáticos en el archivo exe en sí y acceder a ellos

Puedo acceder a mi archivo cuando library.zip no incluye el exe.

Agrego un archivo: text.txt en el directorio: foo/media en library.zip. y utilizo este código:

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") 

intento utilizar pkg_resources pero creo que yo no entiendo algo porque pude abrir directamente "library.zip".

Mi pregunta es ¿cómo puedo hacer esto cuando library.zip se incrusta en exe?

Saludos

Jean-Michel

Respuesta

0

No se debe utilizar pkg_resources para recuperar el archivo library.zip. Deberías usarlo para recuperar el recurso agregado.

Suponga que tiene la siguiente estructura del proyecto:

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

que usaría resource_string (o, preferiblemente, resource_stream) para acceder a imagen.jpg:

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

Eso debería "sólo trabajo". Al menos lo hizo cuando integé mis archivos multimedia en el EXE. (Lo siento, desde entonces he dejado la compañía donde estaba usando py2exe, así que no tengo un ejemplo de trabajo para dibujar).

También podría intentar usar pkg_resources.resource_filename(), pero no creo eso funciona bajo py2exe.

1

Gracias, pero he encontrado la solución

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() 

Saludos

10

I improvisado una solución razonablemente ordenada para esto, pero no utiliza pkg_resources.

Necesito distribuir herramientas de productividad como EXEs independientes, es decir, todo incluido en el archivo .exe. También necesito enviar notificaciones cuando se utilizan estas herramientas, lo que hago a través de la API de registro, usando una configuración basada en archivos. Completé el archivo logging.cfg para dificultar la desactivación efectiva de estas notificaciones, es decir, eliminando el archivo suelto ... lo que probablemente rompería la aplicación de todos modos.

Así que el siguiente es los bits interesantes de mi 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']}}, 
) 

Luego, en el código de inicio para 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) 
    ... 

trabaja un convite !!!

+0

¡Buena solución! ¡Lo usé y funciona genial! – foresightyj

+0

¿Funcionaría esto en archivos png? Estoy a punto de intentarlo, pero si saben, les agradecería mucho. –

+0

Está bien, hay algunos problemas de formato de archivo, ya que pensé en investigarlos, pero aparte de eso debería funcionar, ¿verdad? –

Cuestiones relacionadas