Наличие py2exe включает мои файлы данных (например, include_package_data) - PullRequest
3 голосов
/ 01 мая 2010

У меня есть приложение Python, которое включает файлы данных, не относящиеся к Python, в некоторые из своих подпакетов. Я использовал include_package_data в моем setup.py, чтобы автоматически включать все эти файлы при распространении. Хорошо работает.

Теперь я начинаю использовать py2exe. Я ожидал увидеть, что у меня есть include_package_data=True и включить все файлы. Но это не так. В library.zip помещаются только мои файлы Python, поэтому мое приложение не работает.

Как сделать так, чтобы py2exe включал мои файлы данных?

Ответы [ 4 ]

5 голосов
/ 01 мая 2010

Я решил решить эту проблему, предоставив py2exe опцию skip_archive=True. Это заставило его помещать файлы Python не в library.zip, а просто в виде простых файлов. Затем я использовал data_files, чтобы поместить файлы данных прямо в пакеты Python.

3 голосов
/ 01 мая 2010

Вот что я использую, чтобы получить py2exe, чтобы связать все мои файлы в .zip. Обратите внимание, что для доступа к вашим файлам данных вам необходимо открыть zip-файл. py2exe не будет перенаправлять звонки для вас.

setup(windows=[target],
      name="myappname",
      data_files = [('', ['data1.dat', 'data2.dat'])],
      options = {'py2exe': {
        "optimize": 2,
        "bundle_files": 2, # This tells py2exe to bundle everything
      }},
)

Полный список параметров py2exe здесь .

3 голосов
/ 01 мая 2010

include_package_data - это опция setuptools, а не distutils. В классических дистрибутивах вы должны указать местоположение файлов данных самостоятельно, используя директиву data_files = []. py2exe то же самое. Если у вас много файлов, вы можете использовать glob или os.walk для их получения. См., Например, дополнительные изменения (добавления файлов данных), необходимые для setup.py, чтобы заставить модуль наподобие MatPlotLib работать с py2exe.

Существует также список рассылки обсуждение , которое имеет отношение к делу.

0 голосов
/ 22 августа 2017

Я смог сделать это, переопределив одну из функций 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

Я получил идею от здесь , но, к сожалению, py2exe изменил то, как они себя чувствуют. Надеюсь, это кому-нибудь поможет.

...