Преобразование emf в jpeg с использованием PIL работает в python, но не в пакетном exe-файле pyinstaller

У меня есть своеобразная проблема на пересечении формата изображения EMF, библиотек изображений python PIL (а также Pillow) и программы Pyinstaller для упаковки Python в исполняемый файл Windows.

У меня есть скрипт, который использует PIL/Pillow для преобразования файла EMF в JPEG. Это работает правильно, когда я запускаю скрипт python в python. Однако, когда я упаковываю его в EXE с помощью Pyinstaller.exe -F, он не работает.

С версией Pillow я получаю простую ошибку, говорящую

«Не удается преобразовать image1.emf».

С версией PIL я получаю более длинное сообщение, в котором говорится:

Трассировка (последний последний вызов): Файл "", строка 38, в файле "", строка 27, в файле convertImageFile "C:\Embibe\Git\content-ingestion\src\build\convertImage\out00-PYZ.pyz\ PIL .Image", строка 2126, в открытом IOError: не удается идентифицировать файл изображения "image1.emf"

Кто-нибудь еще сталкивался с этим и нашел рабочее решение?

Далее следуют кровавые подробности, если они вам нужны... :-)

ОС: Windows 7 64-битная (но все ПО 32-битное)

Программное обеспечение:: 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.

При упаковке в exe с использованием \python27\scripts\pyinstaller.exe -F convImg.py и запуске как convImg.exe image1 выдает ошибки, перечисленные выше для версий Pillow и PIL.

Я нашел связанный пост здесь, проблемы Pyinstaller с Pillow, но решение для него, а именно использование py2app вместо pyinstaller для меня не вариант, так как это для MacOS, а мне нужна Windows. Я рассматривал возможность использования аналогичных альтернатив для Windows, py2exe и cx_freeze, но они не создают один автономный исполняемый файл, как это делает pyinstaller.

Спасибо, Амит


person AmitRao    schedule 12.06.2014    source источник
comment
Обновление: я нашел здесь еще один вопрос, который может быть актуальным, мне нужно будет подробно его понять и попробовать: stackoverflow.com/questions/10453858/   -  person AmitRao    schedule 12.06.2014
comment
Обновление: еще одна возможная подсказка здесь, в документации py2exe: py2exe.org/index.cgi/py2exeAndPIL   -  person AmitRao    schedule 12.06.2014
comment
Добро пожаловать в СО. Способ задать фантастический вопрос, а также провести исследование после вопроса! +1. Ссылка в вашем втором комментарии - это то, что я как раз собирался предложить - это то, как я работаю с использованием PIL в скомпилированном приложении (я использую py2exe, а не pyinstaller, но исправление, вероятно, такое же). Молодец, друг.   -  person g.d.d.c    schedule 12.06.2014
comment
Спасибо, g.d.d.c :) Просто учусь ТАК... какой фантастический ресурс! Я понял, что мне, вероятно, следовало отредактировать свой пост с двумя обновлениями, а не добавлять их в качестве комментариев: P Да, попробую второй вариант и обновлю здесь...   -  person AmitRao    schedule 13.06.2014


Ответы (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-файл запускается правильно :-) Благодаря g.d.d.c. за подтверждение того, что я был на правильном пути с решением!

person AmitRao    schedule 16.06.2014