2013-02-17 86 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