X11 Tkinter + PIL + py2app = IOError无法识别图像文件

时间:2013-02-17 19:29:51

标签: python tkinter python-imaging-library py2app ioerror

我有一个python程序(python 2.7.3,X11 Tkinter,py2app 0.6.4,MacOS X 10.7.4)的问题,我正在尝试导出到py2app。该问题仅在程序的独立py2app-ified应用程序版本中开始。当我运行创建应用程序的python源文件时,问题不存在,所以我觉得它必须与py2app导出有关。

问题:当我启动GUI时,第一次尝试加载有效的图像文件时,图像无法加载,我从PIL图像模块中收到以下错误:

File "Image.pyc", line 1980, in open
IOError: cannot identify image file

当我(不关闭GUI或任何内容)尝试打开完全相同的文件时,它会完美加载,没有错误或问题。每次都会发生这种情况,我尝试的任何图像文件 - 第一次尝试加载失败,后续尝试成功。我应该补充说,在第一次出错之后,没有图像文件无法加载 - 即使它们与第一个不同。

一些注意事项:   - 图像文件是一个序列,并且非常大(大约300 MB),因此为了加快加载过程,我使用了mmap。我试过删除mmap步骤,直接将常规文件对象直接传递给ImagePIL.open,问题不受影响。
  - 我还尝试在将文件提供给ImagePIL.open之前寻找文件的开头,但这没有任何效果。   - py2app安装文件非常香草 - 它只包含一些配置文件和一个图标。

以下是违规图像加载功能的相关部分:

import Image as ImagePIL
import mmap as m
...
...
def loadImage(self):
    errorLog.debug("Attempting to open image \""+self.filenameVar.get()+"\"")
    try:
        if self.fileMap is not None:
            self.fileMap.close()
        imageFile = open(self.filenameVar.get(), 'r')
        self.fileMap = m.mmap(imageFile.fileno(), 0, prot=m.PROT_READ)
#       self.fileMap.seek(0)
        self.imageSeries = ImagePIL.open(self.fileMap)
        imageFile.close()
    except(IOError):
        errorLog.exception("Failed to open image \""+self.filenameVar.get()+"\"")
        return

我很难过 - 任何想法?提前谢谢!

编辑:我应该补充一点,使用MacPorts 2.1.2安装了Tkinter,PIL和py2app,这有助于提供帮助。

2 个答案:

答案 0 :(得分:0)

似乎py2app没有将PIL的图像插件包含到应用程序包中,即使其中一个py2app配方试图确保它们被包含在内。

您可以尝试使用“python setup.py py2app --packages = PIL”进行构建,然后使用“import PIL.Image as ImagePIL”来使用它。

我还不明白为什么PIL配方不起作用,它可能是MacPorts构建python包的方式(我自己不使用MacPorts)。

答案 1 :(得分:0)

问题是Pillow 3.0.0版和py2app之间不一致的结果。

我建议两种避免PIL(Pillow)的解决方案

  1. 使用opencv代替PIL。
  2. 卸载当前版本的Pillow并安装上一个如1.7.8