Включение поддержки JPEG для QImage в py2exe-скомпилированных скриптах Python?

Я пытаюсь использовать изображение JPEG в объекте QImage из скрипта Python с PyQt4.

сам скрипт работает отлично, изображение загружается и может быть обработано и визуализировано и все. Однако, когда я пытаюсь "скомпилировать" этот скрипт с py2exe, все работает, кроме JPEG-изображения. Замена его эквивалентом PNG работает, но поскольку моя программа загружает изображения из интернета, они не всегда будут в формате PNG, и я не могу позволить себе конвертировать их все с другим библиотека.

Я обнаружил, что поддержка изображений JPEG для QImage, наряду с другими форматами изображений, обеспечивается некоторыми библиотеками DLL в каталоге qtpluginsimageformats (они называются qjpeg4.dll и qjpeg4d.dll). Я думаю, что мне нужно использовать их как-то в моем исполняемом файле, но я не знаю, как. Я попытался просто скопировать их в каталог exe, не повезло. Я пробовал, как указано, что, чтобы включить эти файлы в качестве data_files в setup.py сценарий, но не повезло (похоже, все он копирует эти файлы в каталог exe, поэтому он ничего не меняет от копирования их вручную в любом случае).

Я уверен, что есть несколько приложений, использующих PyQt с изображениями JPEG, как они это делают? Это казалось тривиальной задачей, но я застрял на ней сейчас.

кроме того, я хочу, чтобы мое приложение было кросс-платформенным (зачем еще мне кодировать на Python?), Я надеюсь, что я не столкнусь с такой проблемой упаковки (это не единственный) при упаковке для OS X или Linux. Будет Я?

12 ответов


после нескольких часов спотыкаясь с той же проблемой, я хотел бы поделиться решением, которое работало для меня в windows vista: используя вместо python2.6

скопируйте следующий каталог в каталог dist, созданный py2exe:

C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats

Я просто опустил каталог imageformats непосредственно в мой каталог dist без каких-либо дальнейших изменений в qt.conf или что-то в этом роде. Я не пробовал, но это может сработать и для phonon.


Я должен признаться, что мне никогда не удавалось получить комбинацию py2exe + pyqt совершенно правильно (и py2exe вообще не помогает с кросс-платформенной упаковкой). PyInstaller кажется намного лучше-документы в http://www.pyinstaller.org/ старые, но ствол svn намного более свежий. Некоторые документы в слайдах, данных на недавней конференции Pycon Italia Tre -- http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf -- и, слайды на английском языке и содержат электронную почту текущего сопровождающего, поэтому они должны помочь! (И давайте все лоббировать текущий сопровождающий для обновления документов...!-)


попробуйте добавить qt.conf файл в каталог вашего exe, чтобы сообщить qt, где найти двоичные файлы и плагины.

что-то вроде следующего работает для простого случая, когда вы просто сбрасываете все dll в том же каталоге, что и exe:

[Paths]
Prefix = .
Plugins = .

Update: затем скопируйте содержимое плагинов (каталоги imageformat/sqldriver и т. д.) В exe-каталог. Я не думаю, что вы можете загружать DLL плагинов из того же каталога, что и exe. См.Qt plugin doc для сведения о подкаталогах plugon. (Или, оставьте ' plugins = ."и скопируйте плагин dir в exe dir, так что у вас есть /plugins/imageloaders/qjpeg4.файл DLL.)


Этьен-Спасибо за совет. После долгого чтения и проб и ошибок я пришел к тому же выводу: используйте PIL для отображения JPEG в приложении, созданном py2app.

http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/

Я предполагаю, что предлагаемые решения для py2exe/Windows не обязательно применяются к py2app/OSX.


Я на OSX Leopard. Предположим у вас есть приложение MyApp.app.

  • поставить библиотеки libqjpeg.dylib и libqgif.dylib на
    MyApp.app/Contents/plugins/imageformats/
  • поставить это в qt.conf на MyApp.app/Contents/resources/:

    [Paths]
    Prefix = .
    Binaries = .
    

на моей машине (Leopard) это работает.


после тщетной попытки всех вышеперечисленных решений я просто использовал PIL для загрузки своих изображений. Поскольку я хотел преобразовать эти изображения в текстуру в виджете OpenGL Qt, результат был тем же, загружаю ли я изображение с помощью Qt или PIL. Тем не менее, я озадачен тем, что такая базовая вещь, как загрузка jpeg, настолько сложна в библиотеке GUI, как хорошо известная и широко используемая как Qt.


У меня была точно такая же проблема. Исправлено с помощью этого:http://mail.python.org/pipermail/python-list/2008-June/669374.html

  1. скопируйте Плагины Qt в каталог: $YOUR_DIST_PATH/PyQt4 / plugins;
  2. копировать qt.conf к вашему каталогу dist;
  3. редактировать qt.conf, измените префикс на ./В составе PyQt4

для меня проблема была решена просто копированием " qt.conf " для каталога исполняемого файла.

вы можете найти " qt.conf " in ...Сайт-пакеты \\\PythonXX Либ\в составе PyQt4\Кварты.conf.

Спасибо за помощь.


все выше не удалось для меня, пока я не понял, что я был комплектации the .exe (то есть у меня была опция "bundle_files": 2 в моем setup.py - ... Я изменил его на bundle_files = 2, и теперь он отлично работает.

вышеуказанные решения в порядке. В частности, я просто добавил следующую строку в свой setup.py: data = [("imageformats", glob.Глоб("C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats*.dll"))]

(в дополнение к другим файлам, курс.)

тогда библиотеки загрузки изображений находятся в MY_EXE_DIR/imageformats

Мне не нужен qt.conf, чтобы сделать эту работу, хотя я уверен, что вы могли бы использовать его, если хотите сохранить свое дерево каталогов менее загроможденным.


можно использовать плагин в формате JPEG с py2exe бы скрипт, даже используя bundle_files. Вам нужно организовать две вещи, чтобы заставить это работать правильно:

  1. скопируйте PyQt4 / plugins / imageformats в выходной каталог py2exe (по умолчанию:dist)

    вам нужно только скопировать форматы, которые вам действительно нужны.

  2. при использовании параметра bundle_files нужно execlude на Qt dll файлы из zip-файл с помощью для pyexe.

    вам все равно нужно скопировать DLL Qt в выходной каталог каким-то другим способом (например, используя ).


в windows предлагаемые решения работают отлично.

однако, на osx не может заставить его работать даже с инструкциями здесь выше.

вопрос такой:libqjpeg.dylib и libqgif.dylib файлы расположены в /Developer/Applications/Qt/plugins/imageformats/ каталог, и это если вы установили Qt сам, а не только PyQt. эти файлы не работают для меня.

в дистрибутиве PyQt я вижу файлы libqjpeg.bundle и libqgif.bundle на /opt/local/libexec/qt4-mac/plugins/imageformats/, однако это не библиотеки, и кстати я не могу открыть их содержание даже если они у них есть .расширение пакета. использование этих файлов вместо этого также не работает.

мне интересно узнать, что вы сделали, чтобы заставить его работать на OSX. я установил PyQt после данное руководство.


Спасибо за ваши полезные ответы на вопрос! Я столкнулся с той же проблемой, что и вы, и никакие решения не могли помочь. Надеюсь, я использовал VCS и обнаружил, что старая версия моего приложения правильно загрузила изображения JPEG, а новые версии перестали это делать. Я поймал эту ошибку, используя PySide В1.2.2.

чтобы включить загрузку библиотек, я использовал то же решение, что и @Macke (т. е. добавил и отредактировал qt.conf).

мой qt.conf был далее:

[Paths]
Binaries = .
Plugins = qtplugins

C:\Python27\Lib\site-packages\PySide\plugins directory был скопирован qtplugins каталог, поэтому у меня были следующие каталоги:

qtplugins\accessible
qtplugins\codecs
qtplugins\graphicssystems
qtplugins\iconengines
qtplugins\imageformats

у меня был следующий код:

class NotesCalendar(QtGui.QCalendarWidget):
    note_icon = QtGui.QImage("res/16note.png")

переменная класса перемещения NotesCalendar.note_icon конструктор решил проблему, и Qt начал правильно загружать свои библиотеки. Кажется, что конструктор переменных класса прервал некоторые внутренние вещи PySide.

он работает без проблем в Windows. указания правильного qt.conf копирование plugins каталог достаточно, чтобы включить поддержку JPEG в py2exe + PySide построить. Конечно, у вас не должно быть проблем с вашим собственным кодом.

Я надеюсь, что это спасет кого-то день! ;)