Py2exe: встраивайте статические файлы в файл library.zip или exe и получайте к ним прозрачный доступ во время выполнения.

Есть ли способ, чтобы py2exe встраивал статические файлы (и/или подкаталоги статических файлов) в library.zip и/или сам исполняемый файл (с zipfile=None), а затем прозрачно получал доступ к этим встроенным статическим файлам из кода во время выполнения?

Спасибо, Малькольм.


person Malcolm    schedule 15.12.2009    source источник


Ответы (3)


Это похоже на рецепт, который вам нужен: Расширьте py2exe, чтобы скопировать файлы в zip-файл, где pkg_resources можете загрузить их

Для его эффективного использования, вероятно, потребуются некоторые знания pkg_resources, который связан с (частью) setuptools, откуда происходят "яйца Python".

person Peter Hansen    schedule 15.12.2009

Просто подумал, что я поделюсь этим и здесь для тех, кто все еще ищет ответы:

Py2exe: встраивание статических файлов в exe и получить к ним доступ

person Darren Bishop    schedule 10.09.2010
comment
Спасибо, Даррен. С уважением, Малькольм - person Malcolm; 24.09.2010

К сожалению, py2exe изменил способ работы своего модуля, поэтому пример предоставлен здесь больше не работает.

Я смог сделать это, переопределив одну из функций py2exe, а затем просто вставив их в zip-файл, созданный py2exe.

Вот пример:

import py2exe
import zipfile

myFiles = [
    "C:/Users/Kade/Documents/ExampleFiles/example_1.doc",
    "C:/Users/Kade/Documents/ExampleFiles/example_2.dll",
    "C:/Users/Kade/Documents/ExampleFiles/example_3.obj",
    "C:/Users/Kade/Documents/ExampleFiles/example_4.H",
    ]

def better_copy_files(self, destdir):
    """Overriden so that things can be included in the library.zip."""

    #Run function as normal
    original_copy_files(self, destdir)

    #Get the zipfile's location
    if self.options.libname is not None:
        libpath = os.path.join(destdir, self.options.libname)

        #Re-open the zip file
        if self.options.compress:
            compression = zipfile.ZIP_DEFLATED
        else:
            compression = zipfile.ZIP_STORED
        arc = zipfile.ZipFile(libpath, "a", compression = compression)

        #Add your items to the zipfile
        for item in myFiles:
            if self.options.verbose:
                print("Copy File %s to %s" % (item, libpath))
            arc.write(item, os.path.basename(item))
        arc.close()

#Connect overrides
original_copy_files = py2exe.runtime.Runtime.copy_files
py2exe.runtime.Runtime.copy_files = better_copy_files
person Kade    schedule 22.08.2017