背景:在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()可以不必使用。
2)GetGeometryRef()生成的是一个引用,而不是副本。这样一来,一旦我更新feature或是删除feature,就会导致geom出问题,程序退出!
3)说明为了什么发生错误还不报错,还提供解决方案。
最后是我通过修改代码,绕开问题实现同样效果,如下:
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()
三、其他一些解决办法杂记