2009-12-21 3 views
10

J'ai trouvé une solution pour ajouter des fichiers dans library.zip via: Extend py2exe to copy files to the zipfile where pkg_resources can load them.Py2exe: Intégrer les fichiers statiques dans le fichier exe lui-même et y accéder

Je peux accéder à mon fichier quand library.zip ne comprend pas l'exe.

J'ajoute un fichier: text.txt dans le répertoire: foo/media dans library.zip. Et j'utiliser ce code:

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

J'essaie d'utiliser pkg_resources mais je pense que je ne comprends pas quelque chose parce que je pouvais ouvrir directement « library.zip ».

Ma question est comment puis-je faire cela lorsque library.zip est intégré dans exe?

Cordialement

Jean-Michel

Répondre

0

Vous ne devriez pas utiliser pkg_resources pour récupérer le fichier library.zip. Vous devriez l'utiliser pour récupérer la ressource ajoutée.

Supposons que vous ayez la structure de projet suivante:

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

QU'AVEC resource_string (ou, de préférence, resource_stream) pour accéder image.jpg:

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

Cela devrait "juste". Au moins, il l'a fait quand j'ai regroupé mes fichiers multimédias dans le fichier EXE. (Désolé, j'ai depuis quitté la société où j'utilisais py2exe, donc je n'ai pas d'exemple de travail sur lequel puiser.)

Vous pouvez également essayer d'utiliser pkg_resources.resource_filename(), mais je ne pense pas cela fonctionne sous py2exe.

1

Merci, mais je trouve la solution

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

Cordialement

10

Je bricolé une solution raisonnable propre à cela, mais il n'utilise pas pkg_resources.

J'ai besoin de distribuer des outils de productivité sous forme d'EXE autonomes, c'est-à-dire tous regroupés dans un fichier .exe. J'ai également besoin d'envoyer des notifications lorsque ces outils sont utilisés, ce que je fais via l'API de journalisation, en utilisant la configuration basée sur des fichiers. J'ai ajouté le fichier logging.cfg pour rendre plus difficile la désactivation effective de ces notifications, c'est-à-dire en supprimant le fichier lâche ... ce qui briserait probablement l'application de toute façon.

donc ce qui suit est les bits intéressants de mon 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']}}, 
) 

Ensuite, dans le code de démarrage pour 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) 
    ... 

fonctionne un régal !!!

+0

Solution soignée! Je l'ai utilisé et ça marche super! – foresightyj

+0

Cela fonctionnerait-il sur les fichiers png? Je suis sur le point de l'essayer, mais si vous le savez, je serais reconnaissant d'entendre. –

+0

D'accord, il y a quelques problèmes de formatage de fichier car je pensais que je vais y jeter un œil, mais à part ça ça devrait marcher, n'est-ce pas? –

Questions connexes