自己写脚本打包的时候选择了py2exe这个包,使用过程真的是没少出问题,搜索网上处理方式也只能处理部分报错,剩下的一下还要自己去测试摸索解决办法,总结了一部分经验分享出来,欢迎留言建议。
一、打包环境
系统:Windows7_64位、Windows10_64位; Python:2.7_64位;
其他情况可以参考使用。
二、常见问题
1、py2exe打包过程中因缺失DLL类报错
DLL类报错一般是打包过程中缺失部分动态链接库,这个问题还比较好解决,直接去网上下载对应的DLL,放在要生成文件的根目录下(如下图),放上自用的DLL下载地址(https://cn.dll-files.com/)。
2、Pandas中ImportError: No module named skiplist;
Requests中ImportError: No module named ordered_dict
打包时出现“ImportError: No module named skiplist”错误,意思是在pandas模块目录中没有找到skiplist,但是打开发现目录中是存在skiplist.pyd的。因此,手动修改打包程序如下图。同理,缺失ordered_dict也参考下图设置即可。
#-*- coding:utf-8 -*-
import distutils
import py2exe
import glob
includes=['pandas._libs.skiplist'] #缺失的skiplist模块
distutils.core.setup(windows=['XXXX.py'],
options={'py2exe':{'includes':includes}}) #打包时强制引入该模块
3、ImportError: No module named _shim、No module named schema
这个和第二项同样处理,将includes加入“fiona_shim”、“fiona.schema”模块,如下:
includes=['pandas._libs.skiplist','fiona._shim','fiona.schema']
4、“钉子户”模块:enum
在打包时,根据提示安装缺失的模块包,确认安装无误,确还是会报缺少该部分模块。这种情况下没办法,只能强制把几位“钉子户”拉进来了,同样使用第二项处理(前提你已经确认安装了)。
5、运行EXE直接报错:StopIteration
遇到该错误可以直接将geopandas模块路径(如:D:\Program Files\你的安装路径\Lib\site-packages\geopandas)里“__init__.py”第10行“import geopandas.datasets”给注释掉。
6、打包openpyxl模块时,ImportError: No module named geometry
我在安装openpyxl、jdcal、et-xmlfile模块时,下载的tar.gz压缩包,没有按照步骤安装,而是直接解压扔进site-packages目录中导致出现该问题。解决方法,删掉没正确安装的包,解压后文件夹中有setup.py,直接在地址栏输入cmd并回车,命令行中使用(python setup.py install)正常安装。重新打包,该问题即可解决。
7、pandas模块报错:'module' object has no attribute 'compat'
Traceback (most recent call last):
File "pandas\__init__.pyc", line 42, in <module>
File "pandas\core\api.pyc", line 26, in <module>
File "pandas\core\groupby\__init__.pyc", line 1, in <module>
File "pandas\core\groupby\groupby.pyc", line 20, in <module>
AttributeError: 'module' object has no attribute 'compat'
解决方法:修改“site-packages/pandas/core/groupby”下的“groupby.py”第20行,将“import pandas.compat as compat”改成“from pandas import compat”。
8、WindowsError: [Error 193] %1 不是有效的 Win32
Traceback (most recent call last):
File "CT4Shape_MP.py", line 7, in <module>
File "geopandas\__init__.pyc", line 1, in <module>
File "geopandas\geoseries.pyc", line 8, in <module>
File "shapely\geometry\__init__.pyc", line 4, in <module>
File "shapely\geometry\base.pyc", line 17, in <module>
File "shapely\coords.pyc", line 8, in <module>
File "shapely\geos.pyc", line 122, in <module>
File "ctypes\__init__.pyc", line 365, in __init__
WindowsError: [Error 193] %1 不是有效的 Win32
引起该问题是由于py2exe打包时,“geos_c.dll”不能兼容引起,可以在链接(https://cn.dll-files.com/geos_c.dll.html)中找到该dll,下载后覆盖即可。
9、其他待补充。。。