让py2exe包含我的数据文件(如include_package_data)

3 投票
4 回答
17144 浏览
提问于 2025-04-15 22:13

我有一个用Python写的应用程序,它的一些子包里包含了非Python的数据文件。我在我的setup.py文件中使用了include_package_data这个选项,这样在打包的时候就能自动把这些文件都包含进来,效果很好。

现在我开始使用py2exe这个工具。我原本以为它会识别到我设置了include_package_data=True,然后把所有的文件都包含进去。但实际上并没有,它只把我的Python文件放进了library.zip里,这样我的应用程序就无法正常工作了。

我该怎么做才能让py2exe把我的数据文件也包含进去呢?

4 个回答

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的所有选项完整列表可以在这里找到。

3

include_package_data 是一个 setuptools 的选项,而不是 distutils 的选项。在传统的 distutils 中,你需要自己指定数据文件的位置,使用 data_files = [] 这个指令。如果你使用 py2exe 也是一样的。如果你有很多文件,可以用 globos.walk 来获取它们。比如,想让像 MatPlotLib 这样的模块和 py2exe 一起工作,你需要在 setup.py 中做一些额外的修改(添加数据文件)。你可以查看这个 链接 来了解更多。

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

6

我最后通过给py2exe设置一个选项skip_archive=True来解决了这个问题。这个选项让它把Python文件放在了普通文件夹里,而不是放在library.zip这个压缩包里。然后我使用data_files把数据文件直接放进了Python包里。

撰写回答