Wxpython PyIO安装程序访问zip时出错

Wxpython PyIO安装程序访问zip时出错,wxpython,pyinstaller,zipfile,Wxpython,Pyinstaller,Zipfile,我有一个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

我有一个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>
回溯(最近一次呼叫最后一次):
文件“”,第26行,在
文件“”,第18行,在_init中__
文件“J:\Programs\Python\PyInstaller\build\test\out00 PYZ.PYZ\PIL.Image”,第2274行,打开
IOError:无法识别图像文件
我不知道这里出了什么问题。请帮忙


谢谢。

除非您没有编辑
.spec
文件/编写了一个钩子文件,否则您的ZIP文件在自动打包期间不会被包括在内

看。如果可能,您可以在运行时查看ZIP文件是否位于假定的位置

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


在PyInstaller文档页面中搜索
数据文件
,并选择最适合您的方法。

我还标记了问题的可能副本,因此您可以链接到答案(对于
--onefile
),请详细说明我需要在规范文件中添加什么?我应该在spec文件中写些什么来为zip文件添加一个钩子?我的zipfile与我的py文件位于同一文件夹
os.getcwd()
。谢谢你在链接帖子中尝试了被接受的答案,看到我在你问题下面的评论了吗?(没有勺子喂食)我忘了提到,我的程序中已经有resource_path函数,并按照[]中提到的配置了我的规范文件。但是我得到了相同的错误。然后我按照您建议的接受答案更改了函数。现在我得到了一个不同的错误:
文件“J:\Programs\Python\PyInstaller\build\test\out00 PYZ.PYZ\zipfile”,第756行,在[Errno 2]中没有这样的文件或目录:“C:\\Users\\Joydeep\\AppData\\Local\\Temp\\\\u MEI23442\\Data.zip”
我遇到了同样的问题。我发现我必须给PyInstaller规范文件,而不是py文件(否则PyInstaller将很高兴再次创建spec文件,并失去您所有的努力)。我将resource_path函数放在spec文件中,但得到的错误与上面的注释相同。我尝试了
path=getattr(sys,'.\u MEIPASS',os.getcwd())
也在spec文件中,但出现了相同的错误。但是,如果我将zip文件解压缩到另一个文件夹,则程序运行正常。但我不喜欢这种解决方案。