Включение поддержки 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.
Я предполагаю, что предлагаемые решения для 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. Вы должны организовать две вещи, чтобы заставить это работать должным образом:
Скопируйте PyQt4/plugins/imageformats в выходной каталог py2exe (по умолчанию:
dist
)Вам нужно только скопировать форматы, которые вам действительно нужны.
Когда вы используете опцию 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
- Скопируйте плагины Qt в каталог: $YOUR_DIST_PATH/PyQt4/plugins;
- Скопируйте qt.conf в ваш каталог dist;
- Отредактируйте qt.conf, измените Префикс на./PyQt4