2013-02-17 92 views
1

我有一个Python程序有问题(蟒蛇2.7.3,X11的Tkinter,py2app 0.6.4,MacOS X的10.7.4),我试图出口到py2app。该问题只发生在程序的独立py2app-ified应用程序版本中。当我运行创建应用程序的python源文件时,问题不存在,所以我觉得它必须与py2app导出有关。X11的Tkinter + PIL + py2app = IO错误无法识别图像文件

的问题:当我启动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 

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

编辑:我要补充的是Tkinter的,PIL,并且使用的MacPorts 2.1.2,在起飞的机会,帮助安装了py2app。

+1

你真的使用的Tkinter与X11 OSX下?在运行'python setup.py py2app -A'(注意'-A')后它工作吗? – mmgp 2013-02-18 00:27:48

+0

@mmgp:我只是尝试用别名模式构建我的程序py2app,并且问题不会发生!它完美的作品。那为什么会这样呢? **你有什么想法我可以得到这个工作在部署模式**?谢谢!! 哦,是的,我真的在OSX上使用Tkinter X11。我最近发现有一个Tkinter版本在OSX中使用本地窗口,并且正在计划切换到那个版本,但还没有。 – Brionius 2013-02-18 01:03:53

+0

我可以猜测,加载特定图像格式所需的其他库不被包含/找到。我相信你仍然可以加载一个bmp图像,但是如果猜测是正确的,那么PNG图像会失败。我看到有人在将PIL和py2app结合起来时会报告问题,然后搜索它。 – mmgp 2013-02-18 01:21:38

回答

0

看来,py2app不包括PIL的图像插件到应用程序包,即使py2app食谱的一个尝试,以确保它们都包括在内。

有一两件事你可以尝试是建立与“蟒蛇setup.py py2app --packages = PIL”,然后使用“导入PIL.Image为ImagePIL”来使用它。

我不明白,但为什么PIL食谱不工作,它可能是在MacPorts的构建Python包的方式(我不使用的MacPorts我自己)。

+0

感谢您的答案 - 不幸的是,这并没有解决问题。仍然被这一个难住!喜欢有更多的答案 - 任何人都有另一个想法? – Brionius 2013-03-22 01:10:33

0

问题是枕头版本3.0.0和py2app不一致的结果。

我建议两个解决方案,以避免PIL(枕头)

  1. OpenCV的使用,而不是PIL。
  2. 卸载枕头的当前版本和安装前一个像1.7.8