2014-06-12 83 views
3

我在EMF圖像格式,python PIL(以及Pillow)圖像庫和Pyinstaller程序打包Python的交集處有一個奇怪的問題到Windows可執行文件中。使用PIL emf轉換JPEG使用PIL在python中工作但不是pyinstaller打包的exe

我有一個腳本,使用PIL/Pillow將EMF文件轉換爲JPEG。這在Python中運行python腳本時正常工作。但是,當我使用Pyinstaller.exe -F將它打包到EXE中時,它不起作用。

同枕版本,我得到一個簡單的錯誤說

"Cannot convert image1.emf".

隨着PIL版本,我得到一個較長的消息,說:

Traceback (most recent call last): File "", line 38, in File "", line 27, in convertImageFile File "C:\Embibe\Git\content-ingestion\src\build\convertImage\out00-PYZ.pyz\PIL .Image", line 2126, in open IOError: cannot identify image file 'image1.emf'

有沒有其他人遇到過這一點,並找到了工作方案?

血淋淋的細節如下,如果你需要他們... :-)

操作系統:Windows 7 64位(但所有的軟件是32位)

軟件:: Python的:2.7.5 ,Pyinstaller:2.1,PIL:內置的Python,枕頭:2.4.0

Python腳本convImg.py:

from __future__ import print_function 
import os, sys 
from PIL import Image 

for infile in sys.argv[1:]: 
    f, e = os.path.splitext(infile) 
    outfile = f + ".jpg" 
    if infile != outfile: 
     try: 
      Image.open(infile).convert('RGB').save(outfile) 
     except IOError: 
      print("cannot convert", infile) 

運行方式:convImg.py image1.emf工作正常,併產生image1.jpg。

當使用\python27\scripts\pyinstaller.exe -F convImg.py打包爲exe並以convImg.exe image1運行時,給出了上面列出的Pillow和PIL版本的錯誤。

我在這裏發現了一個相關的帖子,Pyinstaller troubles with Pillow,但它的解決方案,即使用py2app而不是pyinstaller不是我的選擇,因爲這是MacOS,我需要Windows。我考慮使用類似的替代品的Windows,py2exe和cx_freeze,但他們不創建一個像pyinstaller一樣的自包含的exe。

感謝, 阿米特

+0

更新:我在這裏發現了另一個可能相關的問題,需要詳細瞭解它並嘗試一下:http:// stackoverflow。com/questions/10453858/pil-and-jpeg-library-on-windows – AmitRao

+1

更新:py2exe文檔中的另一個可能的線索:http://www.py2exe.org/index.cgi/py2exeAndPIL – AmitRao

+0

歡迎來到SO。問一個奇妙的問題的方式,並詢問後做研究! +1。第二條評論中的鏈接就是我剛剛提出的建議 - 這就是我如何在編譯的應用程序中使用PIL(我使用py2exe,而不是pyinstaller,但修復程序可能相同)。做得好,朋友。 –

回答

1

好吧,我找到了答案,以我自己的問題在http://www.py2exe.org/index.cgi/py2exeAndPIL

問題是,PIL依賴於動態加載許多圖像的插件,並使用pyinstaller或py2exe打包時,找不到這些插件。所以關鍵是 a。明確導入代碼中的所有插件 b。將Image類的狀態標記爲已初始化 c。明確指定的目標格式來保存命令

所以,我修改convImag.py是:

from __future__ import print_function 
import os, sys 
from PIL import Image 
from PIL import BmpImagePlugin,GifImagePlugin,Jpeg2KImagePlugin,JpegImagePlugin,PngImagePlugin,TiffImagePlugin,WmfImagePlugin # added this line 

Image._initialized=2 # added this line 

for infile in sys.argv[1:]: 
    f, e = os.path.splitext(infile) 
    outfile = f + ".jpg" 
    if infile != outfile: 
     try: 
      Image.open(infile).convert('RGB').save(outfile,"JPEG") # added "JPEG" 
     except IOError: 
      print("cannot convert", infile) 

在此之後,pyinstaller工具的工作原理就像一個魅力和包裝的EXE運行正常:-) 感謝GDDC爲了確認我在解決方案的正確軌道上!