Включение поддержки JPEG для QImage в Py2-скомпилированных скриптах Python? - PullRequest
10 голосов
/ 20 мая 2009

Я пытаюсь использовать изображение 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 ]

14 голосов
/ 07 декабря 2009

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

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

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

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

1 голос
/ 21 сентября 2009

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

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

    [Paths]
    Prefix = .
    Binaries = .
    

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

1 голос
/ 28 августа 2009

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

1 голос
/ 23 мая 2009

Попробуйте добавить файл 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).

1 голос
/ 20 мая 2009

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

0 голосов
/ 06 октября 2016

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

Надеюсь, это спасет кого-нибудь за день! ;)

0 голосов
/ 21 апреля 2011

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

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

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

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

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

0 голосов
/ 14 декабря 2010

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

0 голосов
/ 12 января 2010

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

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

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

0 голосов
/ 26 сентября 2009

на окнах, предлагаемые решения работают отлично.

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

...