ITPub博客

pyinstaller打包cx_Oracle库问题处理记录

原创 Python 作者:studywell 时间:2018-11-02 13:30:57 0 删除 编辑

pyinstaller打包cx_Oracle库问题处理记录

这两天打包程序,遇到坑无数,记录一下。


综合网上各类参考信息摘录,地址如下:https://www.cnblogs.com/BigFishFly/p/6337014.html

1.下载cx_Oracle

在windows下不要使用easy_install或者pip,因为这样安装不会同步环境,并报错:

distutils.errors.DistutilsSetupError: cannot locate Oracle include files in...

因此下载cx_Oracle5.3.exe文件安装

https://files.pythonhosted.org/packages/48/83/15dd03c752d8840ce763bfad5ebd02568f16b2d6709a2b7e6ff97bc3c0f3/cx_Oracle-5.3-11g.win-amd64-py2.7.exe


2. 下载Oracle Instant Client或使用完整的数据库客户端安装包,版本需11.2以上。

数据库客户端版本和python版本及位数需一致。

下载地址:

64位:https://www.oracle.com/technetwork/topics/winx64soft-089540.html

32位:http://www.oracle.com/technetwork/topics/winsoft-085727.html

下载后解压到某一路径,并将该路径添加到系统的环境变量,命名为ORACLE_HOME,将ORACLE_HOME添加到path下,否则会报错

cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle

该目录下可自建network\admin文件夹,存放tnsnames.ora, sqlnet.ora or oraaccess.xml文件


3.安装VC环境

Oracle Instant Client libraries需要VC环境,并匹配对应的位数和版本,对应关系如下:

For Instant Client 18 or 12.2 install VS 2013

For Instant Client 12.1 install VS 2010

For Instant Client 11.2 install VS 2005 64-bit or VS 2005 32-bit


4.解决中文乱码问题

4.1设置环境变量(全局,可能对其它Oracle客户端产生影响)

“计算机”->“系统属性”->“高级系统设置”->“系统属性/高级 选项卡”->“环境变量”->“系统变量”->“新建”->

变量名:NLS_LANG

变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK


4.2 python环境下设置

import os  

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'  

#或者os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'

 

5.连接数据库

import cx_Oracle  

db=cx_Oracle.connect('system/oracle@10.98.156.148/oral')

cursor = db.cursor()

cursor.execute ("select * from dba_users where user_id=62")

row = cursor.fetchall ()

print (row[0])

db.commit()  

cursor.close ()

db.close(

如上配置后,不需要再本机上安装Oracle,也不需要新建NETWORK/ADMIN目录添加tnsnames.ora文件,更不要把oci.dll移到site-packages



6.打包后执行报错:cx_oracle_Error object at 0x000

环境:win2008r2_x64+py2.7.13_x64上

错误提示:cx_Oracle.DatabaseError: DPI-1050: Oracle Client library must be at version 11.2

解决:确认当前版本时11以上,如是,将安装路径下Lib和安装路径都添加到path变量前面。



7.win2008r2 x64 直接运行脚本无问题,运行打包程序报错.无法定位程序输入点ucrtbase.terminate 于动态链接库api-ma-win-crt-runtime-11-1-0.dll上

解决步骤:

A、打开CMD,输入 winver.exe ,回车运行,查看当前Windows版本

如果版本为7600,则首先安装:windows6.1-KB976932-X64.exe(链接),将版本升级为?7601:Service Pack 1,再进行第2步;

如果版本如上图所示,为7601:Service Pack 1,直接进行第2步;

B、安装:Microsoft .NET Framework 4.6.1 NDP461-KB3102438-Web.exe(链接);

C、安装:Visual C++ Redistributable for Visual Studio 2015 vc_redist.x64.exe(链接);

D、一般情况下,到第3步问题已经解决,但是如果再一次安装软件,还是会出错“无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll”,那么可以安装补丁:Windows6.1-KB2999226-x64 .msu(链接);



8.错误提示:cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle

如命令行执行报此错误:将instantclient目录下的所有*.dll文件拷贝到Python27\Lib\site-packages目录下,可解决问题。

如程序命令行执行无问题,命令行sqlplus直连数据库无问题,但打包后执行报错。则如下解决

网上类似情况:

https://stackoverflow.com/questions/36478831/pyinstaller-cx-oracle-interfaceerror-unable-to-acquire-oracle-environment-hand

问题的原因是pyinstall打包时没将oracle链接库打包进去,导致换个环境就报错。

先正常打包一遍,生成spec文件,如

python -F checkreport.py -i dl.ico

再编辑程序目录下checkreport.spec文件,修改a.binaries行,修改后如下。须将oraociei11.dll拷贝到本目录下

a.binaries+[('oraociei11.dll','oraociei11.dll','BINARY')],

然后重新编译一遍;

pyinstaller checkreport.spec

测试后在别机器上运行正常。

官网中关于ODBC的资料

https://www.oracle.com/technetwork/database/features/oci/odbc-ic-releasenotes-094306.html


On Windows

Patching the Instant Client ODBC driver on Windows can be done only by manually copying the ODBC driver shared library files and supporting library files from a patched ORACLE_HOME or from an unpacked Oracle Database Bundle patch. These should be copied into the Instant Client directory. Generating an Instant Client ODBC package is not available on Windows. 

The files that must be copied to the Instant Client directory:

ODBC driver shared library files: sqora32.dll, sqoras32.dll, sqresus.dll, sqresja.dll

Required additional files when using Oracle Basic Instant Client:

For 12c: oraociei12.dll, orannzsbb12.dll, oci.dll, oraons.dll, ociw32.dll, oraociei12.sym, orannzsbb12.sym, oci.sym, ociw32.sym

For 11g: oraociei11.dll, orannzsbb11.dll, oci.dll, ociw32.dll, oraociei11.sym, orannzsbb11.sym, oci.sym, ociw32.sym

Required additional files when using Oracle Basic Light Instant Client:

For 12c: oraociicus12.dll, orannzsbb12.dll, oci.dll, oraons.dll, ociw32.dll, oraociicus12.sym, orannzsbb12.sym, oci.sym, ociw32.sym

For 11g: oraociicus11.dll, orannzsbb11.dll, oci.dll, ociw32.dll, oraociicus11.sym, orannzsbb11.sym, oci.sym, ociw32.sym

Note: While copying from the Oracle Database Bundle patch, some of the files above may be missing. This implies that those files are unchanged and do not need to be patched.




9.打包程序运行报错:UnicodeDecodeError: 'utf-8' codec can't decode byte

本机环境:win10_x64,anaconda_3 python 3.6.5_x64,cx_oracle 7

程序在命令行运行无问题,用pyinstaller打包后,本机运行无问题,在别机器运行报错,报错提示如下

C:\Users\super>D:\checkreportv1\checkreportv1\checkreportp36w10.exe

Traceback (most recent call last):

  File "checkreport.py", line 9, in <module>

  File "<frozen importlib._bootstrap>", line 971, in _find_and_load

  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked

  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked

  File "d:\programdata\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module

  File "oradb.py", line 4, in <module>

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 53: invalid start byte [6380] Failed to execute script checkreport


网搜,同类情况

https://ask.csdn.net/questions/647140?sort=votes_count

使用Pyinstaller打包含有cx_Oracle模块遇到的问题


该问题暂没找到解决办法。找了一个win2008r2_x64+py2.7.13_x64+cx_Oracle_5.13环境,打包后转发系统执行正常。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29519108/viewspace-2218516/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-03-04

  • 博文量
    278
  • 访问量
    395397