最近几天,由于项目需求,需要对代码进行打包封装,但打包完后,运行时,出现了一些小错误,这里进行简单的介绍一下。
在之前的博文中《如何在Windows10环境下,对Tensorflow代码进行打包封装(利用PyQt5制作界面)》已经介绍了如何利用PyQt制作界面,如何利用Pyinstaller对代码进行封装打包,这里不作介绍。这篇文章主要对打包过程中存在的部分比较隐秘的小问题进行汇总。
问题一:GDAL命令行下运行成功,但打包后运行出错
之前的博文已经介绍了一些利用GDAL库进行读取影像、创建矢量、矢栅转换等操作,用到的GDAL库版本为2.2.2,代码在cmd命令行下,运行成功,没有问题。
但打包成可执行文件exe后,却一直报错。
经过不断排查,发现出错的地方竟然是ReadAsArray这里,看下面的代码注释部分:
# -*- coding: utf-8 -*-
from osgeo import gdal
#读图像文件
def read_img(filename):
dataset = gdal.Open(filename) #运行正常
im_width = dataset.RasterXSize #运行正常
im_height = dataset.RasterYSize #运行正常
im_bands = dataset.RasterCount #运行正常
im_geotrans = dataset.GetGeoTransform() #运行正常
im_proj = dataset.GetProjection() #运行正常
im_data = dataset.ReadAsArray(0,0,im_width,im_height) ####该行代码出错!!!
del dataset
return im_width, im_height, im_bands, im_proj, im_geotrans, im_data
代码在前面几行都运行成功了,都能正确的读取影像的长、宽、波段数、投影等信息,但运行到 im_data = dataset.ReadAsArray(0,0,im_width,im_height) 这里时,出错了,程序直接退出,也没提示有什么问题。
命令行下能运行成功的代码,不知道为什么打包后就出错了。网上搜了一些此类问题的解决方案,无果。
经过多次尝试后,发现可能是GDAL版本的问题,遂尝试了几个GDAL版本。这里需要说明一下,在使用pip/conda安装GDAL库时,出错了,所以这里采用下载whl文件安装,下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/。
最后,安装GDAL3.1.4版本后,代码在命令行和打包后的exe文件都能正常运行。
虽然代码可以正常运行,但又出现了新的问题,在创建矢量文件时,一直提示一个错误:
ERROR 1: PROJ: proj_create_from_database: Cannot find proj.db
虽然,也能创建矢量文件,但少了一些投影信息文件,ArcGIS也能打开,只是提示没有投影。
这个问题目前还没能有效的解决,在环境变量里添加了proj.db位置也不行。
考虑到这个问题暂时不是最迫切需要解决的,所以后续有时间再看看怎么解决。大家有好的解决方案,也可以通过评论告诉我,感谢!
问题二:打包时,使用upx压缩出错
在之前的博文中《如何在Windows10环境下,对Tensorflow代码进行打包封装(利用PyQt5制作界面)》提到了可以使用upx-3.95-win64 来对代码进行压缩打包,但在使用压缩打包时,命令为: pyinstaller -F test.py --upx upx-3.95-win64,出错了。
这里更新为: pyinstaller -F test.py --upx-dir=upx-3.95-win64,也不知道之前是怎么成功的(上次打包貌似要追溯到2018年了),可能是版本的问题吧!
总结
利用pyinstaller进行打包时,有时候会出现一些莫名其妙的错误,可能更换一下库的版本就能够解决,需要多试试。
建议新建一个环境,在新环境下打包,避免把一些没有用到的库打包进来,使得打包后的文件巨大无比,而且在新环境下,更换版本也比较方便,避免了更换版本导致之前的代码出错等问题。
目前,我仅遇到了这2个问题,后续再有问题,再对此博客进行更新!