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

Я пытаюсь использовать изображение 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. Буду ли я?

12 ответов

Решение

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

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

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

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

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

Нечто подобное работает для простого случая, когда вы просто сбрасываете все dll в тот же каталог, что и exe:

[Paths]
Prefix = .
Plugins = .

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

Признаюсь, мне никогда не удавалось получить правильную комбинацию 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 - и слайды представлены на Английский, и содержат адрес электронной почты текущего сопровождающего, поэтому они должны помочь! (И давайте все лоббируем текущего сопровождающего, чтобы обновить документы...!-)

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

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

    [Paths]
    Prefix = .
    Binaries = .
    

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

Этьен - Спасибо за совет. После долгих чтений и проб и ошибок я пришел к такому же выводу: используйте PIL, чтобы показать jpegs в приложении, сгенерированном 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 не может заставить его работать даже с инструкциями здесь выше.

вопрос: 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, следуя этому руководству.

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

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

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

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

  2. Когда вы используете опцию bundle_files, вам нужно исключить файлы Qt dll из zipfile, используя --dll-excludes опция для pyexe.

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

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

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

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

Спасибо за ваши полезные ответы на вопрос! Я столкнулся с той же проблемой, что и вы, и никакие решения не могли помочь. Надеюсь, я использовал VCS и обнаружил, что старая версия моего приложения правильно загружала изображения JPEG, а новые версии перестали это делать. Я поймал эту ошибку, используя PySide v1.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. Конечно, у вас не должно быть проблем в вашем собственном коде.

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

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

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

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

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

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

У меня была точно такая же проблема. Исправлено с помощью этого: 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
Другие вопросы по тегам