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
并选择最适合您的方法。
我有一个 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
并选择最适合您的方法。