¿Habilitar el soporte JPEG para QImage en scripts Python comstackdos en Py2exe?

Intento usar una imagen JPEG en un objeto QImage a partir de una secuencia de comandos de Python, con PyQt4.

El script en sí funciona perfectamente, la imagen se carga y puede manipularse y renderizarse, y todo. Sin embargo, cuando bash “comstackr” este script con py2exe, todo funciona, excepto la imagen JPEG. Reemplazarlo con un equivalente PNG funciona, pero como mi progtwig descarga imágenes de la web, no siempre estarán en formato PNG y no puedo permitir convertirlos a todos con otra biblioteca.

Descubrí que la compatibilidad con imágenes JPEG para QImage, junto con otros formatos de imagen, es proporcionada por algunos archivos DLL en el directorio \ qt \ plugins \ imageformats (se llaman qjpeg4.dll y qjpeg4d.dll). Creo que necesito usarlos de alguna manera en mi ejecutable, pero no sé cómo. Intenté simplemente copiarlos en mi directorio exe, sin suerte. Intenté, como se indica aquí , incluir esos archivos como data_files en el script setup.py, pero no tuve suerte (parece que todo lo que hace es copiar estos archivos en el directorio del exe, así que no cambia nada de copiarlos manualmente de todos modos )

Estoy seguro de que hay un puñado de aplicaciones que usan PyQt con imágenes JPEG, ¿cómo lo hacen? Parecía una tarea trivial, pero estoy atrapado en eso ahora.

Además, quiero que mi aplicación sea multiplataforma (¿por qué más podría estar codificando en Python?), Espero no tener problemas de empaquetado (no es el único) al empacar para OS X o Linux. ¿Lo haré?

Después de horas de tropezar con el mismo problema, me gustaría compartir la solución que funcionó para mí en Windows Vista: el uso de python2.6

copie el siguiente directorio en su directorio dist generado por py2exe:

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

Acabo de soltar el directorio de formatos de imagen directamente en mi directorio dist, sin más modificaciones a qt.conf o algo por el estilo. No lo he intentado, pero esto también podría funcionar para phonon.

Debo confesar que nunca logré obtener la combinación py2exe + pyqt del todo bien (y, py2exe no ayuda en absoluto con el empaque multiplataforma). PyInstaller parece ser mucho mejor: los documentos en http://www.pyinstaller.org/ son antiguos, pero el tronco svn es mucho más reciente. Algunos documentos están en diapositivas en la reciente conferencia Pycon Italia Tre – http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf – y, las diapositivas están en Inglés, y contiene el correo electrónico del actual mantenedor, ¡así que deberían ayudar! (Y, ¡todos cabildeamos con el actual mantenedor para actualizar los documentos …! -)

Intente agregar un archivo qt.conf al directorio de su ejecutor , para indicarle a qt dónde encontrar los binarios y los complementos.

Algo parecido a lo siguiente funciona para el caso simple, donde simplemente vuelcas todos los dll en el mismo directorio que el exe:

 [Paths] Prefix = . Plugins = . 

Actualización: luego copie los complementos-contenido (los directorios imageformat / sqldriver, etc.) en el directorio exe. No creo que puedas cargar dlls de plugin desde el mismo directorio que el exe. Consulte el documento de Qt Plugin para obtener más información sobre los subdirectorios de plugins . (O bien, omita los ‘complementos =.’ Y copie el directorio de complementos en el directorio exe, para que tenga /plugins/imageloaders/qjpeg4.dll).

Etienne: gracias por el consejo. Después de mucha lectura y prueba y error, llegué a la misma conclusión: use PIL para mostrar jpegs en una aplicación generada por 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/

Lo que supongo es que las soluciones propuestas para py2exe / Windows no se aplican necesariamente a py2app / OSX.

Estoy en OSX Leopard. Supongamos que tiene una aplicación MyApp.app .

  • Coloque las bibliotecas libqjpeg.dylib y libqgif.dylib en
    MyApp.app/Contents/plugins/imageformats/
  • Pon esto en qt.conf en MyApp.app/Contents/resources/ :

     [Paths] Prefix = . Binaries = . 

En mi máquina (Leopard) esto funciona.

Después de probar todas las soluciones anteriores en vano, terminé usando PIL para cargar mis imágenes. Como quería convertir estas imágenes a una textura en un widget OpenGL Qt, el resultado fue el mismo ya sea que cargue la imagen usando Qt o PIL. Aún así, estoy desconcertado de que algo tan básico como cargar archivos JPEG sea tan complicado en una biblioteca de GUI tan conocida y ampliamente utilizada como Qt.

Tuve exactamente el mismo problema. Se solucionó usando esto: http://mail.python.org/pipermail/python-list/2008-June/669374.html

  1. Copie los complementos de Qt en el directorio: $ YOUR_DIST_PATH / PyQt4 / plugins;
  2. Copia qt.conf a tu directorio dist;
  3. Edite qt.conf, cambie Prefijo a ./PyQt4

Para mí, el problema se resolvió simplemente copiando el “qt.conf” para el directorio del ejecutable.

Puede encontrar el “qt.conf” en … \ PythonXX \ Lib \ site-packages \ PyQt4 \ qt.conf.

Gracias por la ayuda.

Todo lo anterior falló para mí hasta que me di cuenta de que estaba agrupando el .exe (es decir, tenía la opción “bundle_files”: 2 en mi setup.py. Lo cambié a bundle_files = 2, y ahora funciona muy bien.

Las soluciones anteriores están bien. Específicamente, acabo de agregar la siguiente línea en mi setup.py: data = [(“imageformats”, glob.glob (“C: \ Python26 \ Lib \ site-packages \ PyQt4 \ plugins \ imageformats * .dll”))]

(además de otros archivos, por supuesto).

Entonces, los dlls de carga de imágenes están en MY_EXE_DIR / imageformats

No necesité un qt.conf para que esto funcione, aunque estoy seguro de que podrías usarlo si deseas mantener tu árbol de directorios menos desordenado.

Es posible usar el plugin JPEG con un script py2exe’d, incluso usando bundle_files. Debes organizar dos cosas para que esto funcione correctamente:

  1. Copie PyQt4 / plugins / imageformats en el directorio de salida de py2exe (predeterminado: dist )

    Solo debe copiar los formatos que realmente necesita.

  2. Cuando use la opción bundle_files, debe ejecutar los archivos dt dll desde el archivo zip utilizando la opción --dll-excludes para pyexe.

    Todavía tiene que copiar las DLL de Qt al directorio de salida de alguna otra forma (como mediante la opción data_files ).

en Windows, las soluciones sugeridas funcionan perfectamente.

sin embargo, en osx no puede hacerlo funcionar incluso con las instrucciones aquí arriba.

La pregunta es: los archivos libqjpeg.dylib y libqgif.dylib se encuentran en el directorio /Developer/Applications/Qt/plugins/imageformats/ y si usted ha instalado Qt, no solo PyQt. estos archivos no funcionan para mi

en la distribución de PyQt, veo los archivos libqjpeg.bundle y libqgif.bundle en /opt/local/libexec/qt4-mac/plugins/imageformats/ , sin embargo, estos no son bibliotecas, y por cierto tampoco puedo abrir sus contenidos, incluso si tener la extensión .blundle. usar estos archivos en su lugar tampoco funciona.

Tengo curiosidad por saber qué has hecho para que funcione en OSX. He instalado PyQt siguiendo esta guía .

¡Gracias por sus útiles respuestas para la pregunta! He encontrado el mismo problema que tú y ninguna solución podría ayudar. Afortunadamente, estaba usando VCS y descubrí que la versión anterior de mi aplicación cargaba imágenes JPEG correctamente y las nuevas versiones dejaban de hacerlo. Capté este error usando PySide v1.2.2 .

Para habilitar la carga de bibliotecas, utilicé la misma solución que @Macke (es decir, agregó y editó qt.conf).

Mi qt.conf fue el siguiente:

 [Paths] Binaries = . Plugins = qtplugins 

C:\Python27\Lib\site-packages\PySide\plugins directory se copió en el directorio qtplugins , por lo que tuve los siguientes directorios:

 qtplugins\accessible qtplugins\codecs qtplugins\graphicssystems qtplugins\iconengines qtplugins\imageformats 

Tuve el siguiente código:

 class NotesCalendar(QtGui.QCalendarWidget): note_icon = QtGui.QImage("res/16note.png") 

Mover la variable de clase NotesCalendar.note_icon al constructor resolvió el problema y Qt comenzó a cargar sus bibliotecas correctamente. Parece que el constructor de variables de clase interrumpió algunas cosas internas de PySide.

Funciona sin problemas en Windows. Especificar el qt.conf correcto de plugins qt.conf y copia es suficiente para permitir el soporte de JPEG en py2exe + PySide build. Por supuesto, no debes tener problemas en tu propio código.

¡Espero que esto salve a alguien por día! 😉