0

我正在尝试创建几个 .qgs 项目文件,以便稍后由 qgis 服务器实例提供服务。为此,我需要根据请求多次启动一个新的 PyQGIS 应用程序。该应用程序在第一次调用时运行顺利,但如果我第二次尝试运行它,我会收到分段错误错误。

这是触发问题的示例代码:

from qgis.core import QgsApplication
import os

os.environ["QT_QPA_PLATFORM"] = "offscreen"

for i in range(2):
    print(f'Iteration number {i}')

    print('\tSet prefix path')
    QgsApplication.setPrefixPath('/usr', False)    
    
    print('\tInstantiating application')
    qgs = QgsApplication([], False)
    
    print('\tInitializing application')
    qgs.initQgis()
    
    print('\tExiting')
    qgs.exitQgis()

执行时,我得到以下输出:

Iteration number 0
        Set prefix path
        Instantiating application
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
        Initializing application
        Exiting
Iteration number 1
        Set prefix path
        Instantiating application
        Initializing application
Segmentation fault

如果我将循环的内容包含在一个函数中并多次调用它,就会发生类似的事情。在这种情况下,第二次调用时会发生分段错误qgs.exitQgis()(并且在此之前添加的任何矢量或栅格层都将无效)。

也许问题是由于某种原因qgs.exitQgis()在退出之前没有真正清理?

该代码在 Debian Bullseye 附带的 Python:3.9 docker 容器上运行。Qgis 已按照 QGIS 文档中的说明进行安装: https ://qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu 。QGIS 版本是 QGIS 3.22.3-Białowieża 'Białowieża'。

为了防止加载时出现导入错误,qgis.core我必须设置环境变量PYTHONPATH = /usr/lib/python3/dist-packages/

4

1 回答 1

0

更新:根据在这篇文章中发现的一条评论的建议:
https ://gis.stackexchange.com/questions/250933/using-exitqgis-in-pyqgis ,
我替换qgs.exitQgis()qgs.exit(),现在该应用程序可以再次实例化任意次数没有崩溃。

目前还不清楚是什么导致了分段错误,但至少我找到了这个解决方法。

于 2022-02-18T18:42:43.737 回答