4 votos

Accidente SIGSEGV en la aplicación pyqgis independiente

Estoy tratando de llegar a un fragmento de código que me permite imprimir mapas PDF con la API de PYQGIS utilizando un espacio de trabajo y una plantilla.

Este código hace el trabajo, pero arroja un error que me impide alinear mapas consecutivos para que se produzcan.

 sys.path.append('/Applications/QGIS.app/Contents/Resources/python')
import os
from qgis.core import (
    QgsProject, QgsComposition, QgsApplication, QgsProviderRegistry)
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge
from PyQt4.QtCore import QFileInfo
from PyQt4.QtXml import QDomDocument
from qgis.core import *

def make_pdf():
    project_path = 'project.qgs'
    template_path = 'template.qpt'
    gui_flag = True
    QgsApplication.setPrefixPath("/Applications/QGIS.app/Contents/Resources/python", True)
    app = QgsApplication(sys.argv, gui_flag)
    app.setPrefixPath("/Applications/QGIS.app/Contents/MacOS", True)
    app.initQgis()
    canvas = QgsMapCanvas()
    QgsProject.instance().read(QFileInfo(project_path))
    bridge = QgsLayerTreeMapCanvasBridge(
    QgsProject.instance().layerTreeRoot(), canvas)
    bridge.setCanvasLayers()
    template_file = file(template_path)
    template_content = template_file.read()
    template_file.close()
    document = QDomDocument()
    document.setContent(template_content)
    composition = QgsComposition(canvas.mapSettings())
    composition.loadFromTemplate(document, {})
    composition.refreshItems()
    composition.exportAsPDF('output.pdf')
    QgsProject.instance().clear()
 

La salida es:

 QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 
QSqlQuery::prepare: database not open
ERROR: Opening of authentication db FAILED
WARNING: Auth db query exec() FAILED
Loading a file that was saved with an older version of qgis (saved in  2.12.1-Lyon, loaded in 2.16.3). Problems may occur.
QObject::startTimer: QTimer can only be used with threads started with    QThread

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
 

Ese error de SIGSERV al final parece bastante desagradable, pero no estoy ni cerca de entender lo que sucede cuando busco eso en Google.

3voto

Michael Puntos 11

Segmetation fallos

Un fallo de segmentación (SIGSEGV) es un error genérico que indica que la aplicación ha dejado de funcionar. Sólo desde el mensaje, es imposible saber exactamente qué ha ido mal.

Si el accidente ocurre en el final, cuando la aplicación está saliendo (que parece ser un escenario posible aquí), también podría ser válido para aceptarlo.

La depuración

Para investigar el problema, será necesario identificar donde es exactamente lo que sucede. Hay diferentes posibilidades de cómo hacerlo:

  • Agregar print declaraciones y comprobar hasta donde se ejecuta la aplicación
  • El uso de un depurador (como gdb o llvm), esto da mucho comprensión de exactamente lo que sucede, pero también es más complejo de configurar y requiere de una buena experiencia para interpretar correctamente.
  • Dependiendo del sistema y su configuración también puede ser capaz de obtener una traza de la caída, que también da buenas pistas sobre lo que sucede. Explicar esto en detalle estaría fuera del alcance de esta pregunta.

Las sugerencias para el código

Algunas notas sobre el código

  • Sólo debe haber una QgsApplication que debe existir en toda la vida útil de la aplicación
  • Este QgsApplication instancia debe ser inicializado sólo una vez
  • También hay siempre una QgsProject (es un singleton). No puede ser de varios QgsMapCanvas pero no estoy seguro de si lo que se requiere para el caso de uso. (Nota, esto probablemente va a cambiar con QGIS 3, donde varios proyectos que pueden existir en paralelo)
  • También hay un método app.exitQgis() que limpia los recursos en la final (y podría arreglar errores en la salida a veces)
  • No use *-de las importaciones. No introducir cualquier tipo de problemas aquí, pero es una mala práctica. Por ejemplo, será más fácil para actualizar su código de QGIS 3.0 si usted está usando explícito de las importaciones.

En resumen: inicializar QGIS una vez, en bucle, sólo a través de la cartografía y de exportación código de sí mismo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X