即使在 exitQgis() 之后第二次创建 PyQGIS 独立应用程序后出现分段错误 - Debian
Segmentation Fault after creating PyQGIS standalone application the second time even after exitQgis() - Debian
我正在尝试创建几个 .qgs 项目文件,以便稍后由 qgis Server 实例提供服务。
为此,我需要根据要求多次启动新的 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()
并没有在退出前真正清理?
代码 运行ning 在 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/
。
更新:根据关于此 post 的一条评论的建议:
https://gis.stackexchange.com/questions/250933/using-exitqgis-in-pyqgis,
我将 qgs.exitQgis()
替换为 qgs.exit()
,现在应用程序可以再次实例化任意次数而不会崩溃。
目前还不清楚导致分段错误的原因,但至少我找到了这个解决方法。
问题似乎在 QGIS 版本中已修复。 3.24 蒂斯勒。现在可以在循环中调用 qgs.exitQgis() 而不会触发分段错误。
我正在尝试创建几个 .qgs 项目文件,以便稍后由 qgis Server 实例提供服务。 为此,我需要根据要求多次启动新的 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()
并没有在退出前真正清理?
代码 运行ning 在 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/
。
更新:根据关于此 post 的一条评论的建议:
https://gis.stackexchange.com/questions/250933/using-exitqgis-in-pyqgis,
我将 qgs.exitQgis()
替换为 qgs.exit()
,现在应用程序可以再次实例化任意次数而不会崩溃。
目前还不清楚导致分段错误的原因,但至少我找到了这个解决方法。
问题似乎在 QGIS 版本中已修复。 3.24 蒂斯勒。现在可以在循环中调用 qgs.exitQgis() 而不会触发分段错误。