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