簡體   English   中英

X11 Tkinter + PIL + py2app = IOError無法識別圖像文件

[英]X11 Tkinter + PIL + py2app = IOError cannot identify image file

我正在嘗試導出到py2app的python程序(python 2.7.3,X11 Tkinter,py2app 0.6.4,MacOS X 10.7.4)有問題。 該問題僅在程序的獨立py2app-ified應用程序版本中開始出現。 當我運行從中創建應用程序的python源文件時, 該問題不存在 ,因此我覺得它一定與py2app導出有關。

問題:啟動GUI時,第一次嘗試加載有效的圖像文件時,該圖像無法加載,並且從PIL圖像模塊收到以下錯誤:

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

然后,當我(不關閉GUI或任何東西)嘗試打開完全相同的文件時 ,它加載完美,沒有錯誤或問題。 每當我嘗試使用任何圖像文件時,都會發生這種情況-第一次嘗試加載失敗,隨后的嘗試成功。 我應該補充一點,在出現第一個錯誤之后,即使沒有與第一個不同的圖像文件,也不會加載失敗

一些注意事項:-圖像文件是一個序列,非常大(大約300 MB),因此為了加快加載過程,我使用了mmap。 我嘗試刪除mmap步驟,並將常規文件對象直接交給ImagePIL。直接打開它,問題不受影響。
-我還嘗試在將文件提供給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的機會,這很有幫助。

似乎py2app並未將PIL的圖片插件包含在應用程序捆綁包中,即使py2app食譜之一試圖確保將其包含在內。

您可以嘗試做的一件事是使用“ python setup.py py2app --packages = PIL”進行構建,然后使用“將PIL.Image作為ImagePIL導入”來使用它。

我還不明白為什么PIL配方不起作用,這可能是MacPorts構建python包的方式(我自己不使用MacPorts)。

問題是枕頭版本3.0.0和py2app之間不一致的結果。

我建議兩種解決方法,以避免PIL(枕頭)

  1. 使用opencv代替PIL。
  2. 卸載當前版本的Pillow並安裝以前的版本(如1.7.8)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM