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

StackOverflow https://stackoverflow.com/questions/885906

Вопрос

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

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

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

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

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

Это было полезно?

Решение

После нескольких часов спотыкания с одной и той же проблемой я хотел бы поделиться решением, которое сработало у меня в 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 = .

Обновить:Затем скопируйте содержимое ваших плагинов (каталоги imageformat / sqldriver и т.д.) В каталог exe.Я не думаю, что вы можете загружать библиотеки dll плагинов из того же каталога, что и exe.Видишь Qt плагин doc для получения подробной информации о подкаталогах plugon.(Или оставьте 'plugins = .' и скопируйте каталог плагинов в каталог exe, чтобы у вас был /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/плагины;
  2. Скопируйте qt.conf в свой каталог dist;
  3. Отредактируйте qt.conf, измените префикс на ./PyQt4

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

Вы можете найти "qt.conf" в ...\PythonXX\Lib\site-packages\PyQt4\qt.conf.

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

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

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

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

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

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

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

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

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

  2. При использовании опции bundle_files вам необходимо выполнить Qt dll-файлы из zipfile с помощью --dll-excludes опция для pyexe.

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

в 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/, однако это не библиотеки, и, кстати, я также не могу открыть их содержимое, даже если они имеют расширение .bundle .использование этих файлов вместо этого также не работает.

мне любопытно узнать, что вы сделали, чтобы заставить это работать на 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 to constructor решил проблему, и Qt начал корректно загружать свои библиотеки.Похоже, что конструктор переменной класса прервал какую-то внутреннюю работу PySide.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top