window下使用python import cx_Oracle时报错

    最近几天研究python如何连接oracle数据库,在linux下可以完美解决,root下使用源码安装即可(注意把oracle的环境变量加上),但是在windows下安装出现了问题。

python我使用的是python3.4.4,cx_Oracle为5.2.1,结果安装成功后导入时报错:


在python下输入:
import cx_Oracle

Traceback (most recent call last):
  File "", line 1, in 
    import cx_Oracle
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序

一开始查资料,说是版本不一致,要么python跟cx_Oracle都是32位,要么都是64位,后来检查了下,发现都是64位的,没有理由再报错啊。


再细看报错 DDL load failed,突然想到python在连接数据库时需要调用oracle客户端的库文件(oci.dll),他们之间的版本也要一致,果不其然。

查询了下oracle客户端的版本,发现是32位的,果断安装64位客户端,然后再次导入ox_Oracle模块,成功,如下:

C:\Users\md>python
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>>
连接成功后可以执行数据库操作了,oh yeah!
>>> cx_Oracle.clientversion()
(11, 2, 0, 1, 0)
>>> db=cx_Oracle.connect('system','oracle','192.168.56.10:1521/orcl')
>>> print (db.version)
11.2.0.4.0
>>> cr = db.cursor()
>>> sql = 'select open_mode from v$database'
>>> cr.execute(sql)
>
>>> rs=cr.fetchall()
>>> print (rs)
[('READ WRITE',)]
>>>

综上,我们使用python通过cx_Oracle模块连接Oracle时,一定要注意保证三者(python,cx_Oracle,Oracle客户端)版本对应,位数一致



补充一下三者位数不一致的影响,近期发现(2017/8/31):

原版本:

Python3.6.1 64bit

cx_Oracle 6.0.1 64bit

oracle客户端 11.2.0.4 32bit

发现在建立到db的连接语句时报错:

db = cx_Oracle.connect(username,passwd,dsn)
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 95-96: invalid continuation byte

本来以为是字符集nls_lang问题,后来发现其实数据库没有连接时(oracle关闭时也是会报错的)


最后换了oracle客户端为12.2.0.1 bit64位,一切正常




你可能感兴趣的:(oracle,python)