1 介绍
使用pyinstaller对python程序打包是一种常见形式。使用pip方式安装以下相关包,其中sqlalchemy建议安装1.3.13版本。
pip install ibm_db==3.0.4
pip install ibm_db_sa==0.3.6
pip install sqlalchemy==1.3.13
pip install pyinstaller==4.3
pip install cx-Oracle==8.2.1
2 打包DB2
2.1 python版本问题
python包版本建议在3.6.5以上(包括python3.6.5版本),采用3.6.5以下版本会遇到无法识别clidriver驱动问题。
2.2 数据库驱动问题
报错类型:ConnectionError: ibm_db_dbi::Error: [IBM][CLI Driver] SQL10007N Message "0" could not be retrieved. Reason code: "3". SQLCODE=-1042
解决方法: 在使用pyinstaller打包使用–add_data参数加入CLI Driver驱动。
pyinstaller -F --clean -p='/root/anaconda3/envs/deploy/lib/python3.7/site-packages' --add-data='/root/anaconda3/envs/deploy/lib/python3.7/site-packages/clidriver:./clidriver' tmp.py
2.3 sqlalchemy找不到ibm_db_sa问题
报错类型:sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:ibm_db_sa
解决方法:
1:通过pip show ibm_db_sa找到ibm_db_sa包安装位置,如在我们例子中是/root/anaconda3/envs/deploy/lib/python3.7/site-packages/ibm_db_sa
2:通过pip show sqlalchemy找打sqlalchemy包安装位置,并进入sqlalchemy包下面dialects文件夹。
3:将ibm_db_sa包复制到dialects目录下。具体命令如下:cp -r /root/anaconda3/envs/deploy/lib/python3.7/site-packages/ibm_db_sa /root/anaconda3/envs/deploy/lib/python3.7/site-packages/sqlalchemy/dialects
4: 修改dialects目录下__init__.py文件。在__init__.py文件中__all__变量加入“ibm_db_sa”,如下:__all__ = ( "firebird", "mssql", "mysql", "oracle", "postgresql", "sqlite","sybase", "ibm_db_sa")
5:重新打包
3 打包Oracle
3.1 oracle客户端lib库加载进python环境
报错类型:ConnectionError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help
使用python连接oracle数据库时候需要配置一个oracle客户端,不然会遇到上述错误。一般做法是将客户端目录写入环境变量,实际上也可以将oracle客户端lib直接拷贝进python库中从而避免写环境做法。具体做法如下:
1. 下载oracle客户端ininstantclient_18_5.tar.gz并进行解压
2. 将ininstantclient_18_5复制到python环境中lib库中.具体命令如下:cp instantclient_18_5/lib/* /root/anaconda3/envs/deploy/lib
3.2 oracle客户端lib库打包放进打包环境
pyinstaller打包时不能自己识别包依赖的库文件,需要在打包时候自行加入。将oracle客户端lib库随同脚本打包进可执行文件命令如下:
pyinstaller -F --clean --add-binary=“instantclient_18_5/lib/*:.” tmp.py
4 参考
1. Python安装ibm_db连接DB2
2. 离线安装python的ibm_db模块
3. ibm_db,pyinstaller,DLL issue