El script PySide Qt no se inicia desde Spyder pero funciona desde Shell

Tengo un error extraño en mi proyecto que usa PySide para su Qt GUI y, en respuesta, estoy tratando de probar con un código más simple que configura el entorno.

Aquí está el código con el que estoy probando: https://stackoverflow.com/a/6906552/130164

Cuando lanzo eso desde mi caparazón (python test.py), funciona perfectamente. Sin embargo, cuando ejecuto ese script en Spyder, aparece el siguiente error:

Traceback (most recent call last):
  File "/home/test/Desktop/test/test.py", line 31, in <module>
    app = QtGui.QApplication(sys.argv)
RuntimeError: A QApplication instance already exists.

Si ayuda, también recibo la siguiente advertencia:

/usr/lib/pymodules/python2.6/matplotlib/__init__.py:835: UserWarning:  This call to matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

¿Por qué funciona ese código cuando se ejecuta desde mi shell pero no desde Spyder?


Actualizar: Mata respondió que el problema ocurre porque Spyder usa Qt, lo cual tiene sentido. Por ahora, configuré la ejecución en Spyder usando la opción "Ejecutar en un terminal de sistema externo", que no causa errores pero tampoco permite la depuración. ¿Spyder tiene alguna solución integrada para esto?

preguntado el 22 de mayo de 12 a las 20:05

Debe seleccionar una respuesta y votar. -

4 Respuestas

As Spyder también es un Qt aplicación, inicia su propia QApplication. En el mismo proceso solo uno QApplication puede existir, por eso obtienes el primer error.

Sypder también usa matplotlib, y probablemente, por lo tanto, ya habrá importado algunos de los módulos mencionados, por lo que obtiene el segundo error.

Entonces, cuando lo usas así, no puedes crear tu propio QApplication o llame al matplotlib.use(). O tal vez funcione si envuelve estas llamadas en try/except.

contestado el 22 de mayo de 12 a las 23:05

Eso es lo que sospeché que sería el problema. ¿Sabe si hay alguna solución alternativa integrada en Spyder? Por ahora, configuré la ejecución en Spyder usando la opción "Ejecutar en un terminal de sistema externo", que no causa errores pero tampoco permite la depuración. ¿Quizás Spyder tiene alguna solución para esto? - maximo zaslavski

No conozco a Spyder lo suficiente, así que, además de detectar los errores, no tengo ni idea. - mata

Es cierto que Spyder se ejecuta en una instancia de la aplicación Qt, pero todas las instancias de la consola de Python se ejecutan en sus propios procesos separados. - Jed

Tengo el mismo problema, y ​​en algún lugar de stackoverflow había una solución.

En lugar de

qApp = QtGui.QApplication(sys.argv)

Utiliza

qApp = QtGui.QApplication.instance()
if qApp is None:
        qApp = QtGui.QApplication(sys.argv)

Respondido el 28 de junio de 13 a las 13:06

Tengo el mismo problema pero con las pruebas funcionales (usando Qttest y unittest), su solución lo solucionó bien. Gracias. - gunzapper

No funcionará en Spyder si intenta iniciar la aplicación en una consola interactiva porque esa consola está especialmente configurada para importar varias bibliotecas científicas automáticamente. show() cifras de matplotlib y algunos otros detalles. Escribe scientific en el indicador de la consola de Spyder para obtener más detalles. El resultado es efectivamente que un bucle de eventos de la aplicación Qt ya se está ejecutando allí.

Para que su aplicación se ejecute dentro de Spyder:

  1. Asegúrese de que Spyder esté configurado para abrir consolas externas con PySide y no con PyQt. Esto se puede configurar desde Herramientas>Preferencias>Consola>Módulos externos>Selección de biblioteca de enlaces Qt-Python.
  2. Con su script activo en el editor, presione F6 para abrir el cuadro de diálogo Configuración de ejecución. Seleccione el botón de radio "Ejecutar en un nuevo intérprete de Python dedicado" en lugar de ejecutar en el intérprete interactivo actual. Hacer clic OK. Ahora ejecute el script presionando F5. Depure el script presionando Ctrl+F5.

Respondido el 29 de junio de 13 a las 22:06

El wiki oficial de Spyder tiene una página sobre el tema: https://github.com/spyder-ide/spyder/wiki/How-to-run-PyQt-applications-within-Spyder. La esencia de esto es:

Nota IMPORTANTE: Antes de ejecutar una aplicación PyQt en Spyder, debe cambiar su backend de gráficos a Automatic. Puedes hacerlo yendo a

Tools > Preferences > IPython Console > Graphics

Después de eso, reinicie los núcleos de su consola o Spyder para que este cambio surta efecto.

Hay una explicacion al final:

El problema más común cuando se ejecuta una aplicación PyQt varias veces dentro de Spyder es que una instancia de QApplication permanece en el espacio de nombres del kernel de la consola IPython después de la primera ejecución. En otras palabras, cuando intenta volver a ejecutar su aplicación, ya tiene una instancia de QApplication inicializada.

Intentar eliminar esa instancia probablemente hará que su programa se atasque en un ciclo while de bloqueo, como se sugiere aquíy usando sys.exit() no ayuda, ya que es lo mismo que intentar salir de Python (y, por lo tanto, de la consola de IPython).

Una solución sugerida es hacer algo como lo que @mata sugiere.

Respondido 15 Abr '20, 15:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.