背景:在pycharm中使用python操作gdal库时,控制台报错:

Process finished with exit code -1073740791 (0xC0000409)

然后程序直接退出,无其他提示。

一、问题理解。

pycharm官网中查不到关于该代码的解释,只查到关于JavaFX Application中报出相同问题的提问,这个结果是与显卡驱动相关。

官网问答

根据查到的消息,我觉得code -1073740791 (0xC0000409)表示的错误是,程序由于计算机系统本身性能不足,或是由于对调用的方法理解偏差,导致的库内冲突引发的程序中断。

二、问题解决思路

1.打开模拟输出到终端,以确认问题

具体操作看引用,这里赘述。打开后再运行,有可能发现问题提示,如果发现,再根据提示进行解决即可。

2.判断是否是显卡内存相关问题,如果不是跳过该步骤

检查下pycharm中对于内存配置是否不够。

多个显卡时注意分配好显卡的计算资源。显卡本身能力有限时,也会报错,这时候考虑训练数据分part处理。

3.尝试将发生问题的库进行卸载重装

有可能是库本身安装不正确不完整导致的问题,卸载重装能解决问题。经常看到的时pyqt这个库,其他的也可以考虑试一试。

4.程序本身对库方法使用的问题

有些库的方法被错误使用,并不能直接看出来,需要你去了解库方法相关使用方法和注意事项才行。例如下面这两种:

遇到问题时,尝试进行单元测试,确认下发生问题的导致退出的是哪一个库或是哪些方法,然后检查下这几对这些库方法的使用是否有问题,如果不确定的,最好使用一些别人实现过的代码。

个人案例:

本人一开始盯着code-1073740791 (0xC0000409)去查找问题,一直解决不了,后面才知道要真正定位问题,到对应代码,对应库中找原因。

这里,本人打算已我遇到的情况进行稍微展开的分析,直接上代码。

from osgeo import ogr
………………
geomlist=[]
dirlist=[]
roadlist=[]
feature = layer.GetNextFeature()
while feature:

    roadid=feature.GetField('arcid')
    angle=feature.GetField('northangle')
    geom=feature.GetGeometryRef()
    geomlist.append(geom)
    roadlist2.append(roadid)
    dirlist.append(angle)
    feature.Destroy()
    feature=layer.GetNextFeature()

 

一开始一直没法问题,通过逐个语句删除再运行,首先确定了feature.Destroy()这一句会影响,但也不知道为什么,本人参考的代码段里面也是这样用的。

后面经过尝试,发现根本在于   geom=feature.GetGeometryRef(),一旦给geom赋值,feature一更新后小会就自动退出。但获取要素的几何是我需要的,又不能直接删除,因此接着去找关于GDAL库相关的介绍(注:这里osgeo是GDAL库里的内容)。

解决:最终找到了关于这块的的介绍,网址如下:

Python Gotchas in the GDAL and OGR Python Bindings — GDAL documentationhttps://gdal.org/api/python_gotchas.html这里说下与本问题相关的三点,1)Destroy()可以不必使用。

 

python gdal hdf属性 pycharm gdal_python gdal hdf属性

2)GetGeometryRef()生成的是一个引用,而不是副本。这样一来,一旦我更新feature或是删除feature,就会导致geom出问题,程序退出!

python gdal hdf属性 pycharm gdal_Python_02

3)说明为了什么发生错误还不报错,还提供解决方案。

python gdal hdf属性 pycharm gdal_解决方案_03

 最后是我通过修改代码,绕开问题实现同样效果,如下:

from osgeo import ogr
………………
geomlist=[]
dirlist=[]
roadlist=[]
feature = layer.GetNextFeature()
while feature:

    roadid=feature.GetField('arcid')
    angle=feature.GetField('northangle')
    geom=feature.GetGeometryRef()
    geomlist.append(geom.ExportToWkt())
    roadlist2.append(roadid)
    dirlist.append(angle)
    del geom
    #feature.Destroy()
    feature=layer.GetNextFeature()

三、其他一些解决办法杂记