我有一个 Python 应用程序,它的一些子包中包含非 Python 数据文件。在进行分发时,我一直在使用include_package_data
我的选项来自动包含所有这些文件。setup.py
它运作良好。
现在我开始使用py2exe。我希望它看到我拥有include_package_data=True
并包含所有文件。但事实并非如此。它只将我的 Python 文件放在library.zip
.
如何让 py2exe 包含我的数据文件?
我有一个 Python 应用程序,它的一些子包中包含非 Python 数据文件。在进行分发时,我一直在使用include_package_data
我的选项来自动包含所有这些文件。setup.py
它运作良好。
现在我开始使用py2exe。我希望它看到我拥有include_package_data=True
并包含所有文件。但事实并非如此。它只将我的 Python 文件放在library.zip
.
如何让 py2exe 包含我的数据文件?
我最终通过给 py2exe 选项来解决它skip_archive=True
。这导致它不将 Python 文件放入,library.zip
而只是将其作为普通文件放入。然后我data_files
把数据文件放在 Python 包中。
这是我用来让 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 选项的完整列表在这里。
我已经能够通过覆盖 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 改变了他们当时做事的方式。我希望这可以帮助某人。