3

我有一个 Python 应用程序,它的一些子包中包含非 Python 数据文件。在进行分发时,我一直在使用include_package_data我的选项来自动包含所有这些文件。setup.py它运作良好。

现在我开始使用py2exe。我希望它看到我拥有include_package_data=True并包含所有文件。但事实并非如此。它只将我的 Python 文件放在library.zip.

如何让 py2exe 包含我的数据文件?

4

4 回答 4

5

我最终通过给 py2exe 选项来解决它skip_archive=True。这导致它不将 Python 文件放入,library.zip而只是将其作为普通文件放入。然后我data_files把数据文件放在 Python 包中。

于 2010-04-30T23:29:41.477 回答
3

include_package_data是 setuptools 选项,而不是 distutils 选项。在经典的 distutils 中,您必须使用data_files = []指令自己指定数据文件的位置。py2exe是一样的。如果您有很多文件,您可以使用globos.walk检索它们。例如,请参阅 setup.py 所需的其他更改(数据文件添加)以使 MatPlotLib 之类的模块与 py2exe 一起使用。

还有一个相关的邮件列表讨论

于 2010-04-30T21:51:16.053 回答
3

这是我用来让 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 选项的完整列表在这里

于 2010-04-30T22:25:20.517 回答
0

我已经能够通过覆盖 py2exe 的一个函数来做到这一点,然后将它们插入到由 py2exe 创建的 zipfile 中。

这是一个例子:

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 改变了他们当时做事的方式。我希望这可以帮助某人。

于 2017-08-22T20:07:25.970 回答