Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
360 views
in Technique[技术] by (71.8m points)

resources - Py2exe: Embed static files in exe file itself and access them

I found a solution to add files in library.zip via: Extend py2exe to copy files to the zipfile where pkg_resources can load them.

I can access to my file when library.zip is not include the exe.

I add a file : text.txt in directory: foo/media in library.zip. And I use this 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")

I try to use pkg_resources but I think that I don't understand something because I could open directly "library.zip".

My question is how can I do this when library.zip is embed in exe?

Best Regards

Jean-Michel

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I cobbled together a reasonably neat solution to this, but it doesn't use pkg_resources.

I need to distribute productivity tools as standalone EXEs, that is, all bundled into the one .exe file. I also need to send out notifications when these tools are used, which I do via the Logging API, using file-based configuration. I emded the logging.cfg fileto make it harder to effectively switch-off these notifications i.e. by deleting the loose file... which would probably break the app anyway.

So the following is the interesting bits from my 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']}},
)

Then in the startup code for 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)
    ...

Works a treat!!!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...