我在EMF图像格式,python PIL(以及Pillow)图像库和用于将Python打包成Windows可执行文件的Pyinstaller程序的交叉点存在一个特殊问题。
我有一个使用PIL / Pillow将EMF文件转换为JPEG的脚本。当我在python中运行python脚本时,这可以正常工作。但是,当我使用Pyinstaller.exe -F将其打包到EXE中时,它不起作用。
使用Pillow版本,我收到一个简单的错误
"无法转换image1.emf"。
使用PIL版本,我收到一条更长的消息:
追踪(最近一次通话): 文件"",第38行,in 在convertImageFile中的文件"",第27行 文件" C:\ Embibe \ Git \ content-ingestion \ src \ build \ convertImage \ out00-PYZ.pyz \ PIL .Image",第2126行,处于公开状态 IOError:无法识别图像文件' image1.emf'
有没有其他人遇到过这个并找到了有效的解决方案?
如果您需要血腥细节,请遵循......: - )
操作系统:Windows 7 64位(但所有软件都是32位)
Software :: Python:2.7.5,Pyinstaller:2.1,PIL:内置Python,Pillow: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 :(得分:2)
好的,我在http://www.py2exe.org/index.cgi/py2exeAndPIL
找到了我自己的问题的答案问题是PIL依赖于动态加载许多图像插件,并且当使用pyinstaller或py2exe打包时,它无法找到这些插件。所以关键是要 一个。显式导入代码中的所有插件 湾将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运行正确:-) 感谢g.d.d.c.通过解决方案确认我在正确的轨道上!