PyInstaller IO 访问 zip 时出错

PyInstaller IO Error accessing zip

我有一个 wxpython 程序,我将图片文件保存在一个 zip 文件中。编程 运行 很好,而 运行 宁 python。但是当我 运行 pyinstaller 生成 exe 文件时,我得到 IO 错误。这是我的程序。

import zipfile
import wx
from PIL import Image
from StringIO import StringIO

def PilImageToWxImage(myPilImage):
    myWxImage = wx.EmptyImage(myPilImage.size[0], myPilImage.size[1])
    myWxImage.SetData(myPilImage.convert('RGB').tostring())
    return myWxImage

class Frame1(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)
        z = zipfile.ZipFile("Data.zip", "r")
        zl = z.namelist()
        x = z.read(zl[0])
        y = StringIO(x)
        w = Image.open(y)
        v = PilImageToWxImage(w).ConvertToBitmap()
        u = wx.EmptyIcon()
        u.CopyFromBitmap(v)
        self.SetIcon(u)

if __name__ == "__main__":
    a = wx.App(0)
    f = Frame1(None, -1, "Test")
    f.Show()
    a.MainLoop()

当我在命令提示符下按 python test.py 运行 时,此程序 运行 正常。但是当我 运行 由 pyinstaller --onefile --console --upx-dir='J:\Programs' test.py 生成的 test.exe 文件时,我得到错误:

Traceback (most recent call last):
File "<string>", line 26, in <module>
File "<string>", line 18, in __init__
File "J:\Programs\Python\PyInstaller\build\test\out00-PYZ.pyz\PIL.Image", line 2274, in open
IOError: cannot identify image file <StringIO.StringIO instance at 0x00000000048E1BC8>

我不知道这里出了什么问题。请帮忙。

谢谢。

除非您没有编辑 .spec file/wrote 挂钩文件,否则您的 ZIP 文件不会自动包含在打包过程中。

参见 where the onefile stores the temporary files。如果可能,您可以在运行时查看 ZIP 文件是否在预期的位置。

否则你必须在没有 --onefile 的情况下构建并检查 ZIP 是否存在。如果您将 ZIP 复制到 .EXE 所在的目录,您可以检查错误是否消失(当然只有在您没有使用 --onefile 时才有效)。

在 PyInstaller 文档页面中搜索 data files 并选择最适合您的方法。