cx_Oracle - DLL加载失败
我在用Python导入cx_Oracle时遇到了问题。我知道这里讨论过很多关于cx_Oracle的问题,但我看了所有相关的主题后,还是找不到解决我问题的方法。
我有两台机器,一台是我的电脑,另一台是远程工作站,它们的配置差不多(都是Windows 7,64位)。我需要在远程工作站上安装cx_Oracle,但它不工作,而在我的电脑上却没问题(我可以成功导入这个模块并连接到我的数据库)。在远程工作站上,我遇到了以下错误:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import cx_Oracle
ImportError: DLL load failed: The specified module could not be found.
我仔细检查了我的环境变量,并且重新安装了几次cx_Oracle,但还是无法让它工作……我对这个问题做了一些研究,现在有点卡住了,我不明白为什么在我的电脑上能正常工作,而在这个远程工作站上却不行(唯一的不同是这个远程工作站是虚拟机)。
有没有人知道可能是什么问题呢?
我在我的电脑和远程工作站上都运行了Dependancy Walker,检查cx_oracle.pyd,唯一的不同是远程工作站上找不到MSVCR100和MSVCR90这两个dll。
我的环境变量设置如下:
C:\Oracle作为ORACLE_BASE
C:\Oracle\instantclient_12_1
作为ORACLE_HOMEC:\Oracle\instantclient_12_1
添加到“Path”变量中
两台机器都是64位,Windows 7
我运行的是Python 2.7.5
我把instantclient-basic-nt-12.1.0.1.0解压到了C:\Oracle\instantclient_12_1
我安装了cx_Oracle-5.1.2-11g.win32-py2.7s
在远程工作站上,sys.path
给我的结果是:
'C:\Python27\Lib\idlelib', 'C:\Windows\system32\python27.zip', 'C:\Python27\DLLs', 'C:\Python27\lib', 'C:\Python27\lib\plat-win', 'C:\Python27\lib\lib-tk', 'C:\Python27', 'C:\Python27\lib\site-packages'
编辑 1
在之前的帖子中,所有文件(Python 2.7,cx_Oracle包,Oracle Instant Client)都是针对32位系统的。我下载了相同版本的64位文件,现在在我的远程工作站上一切正常。
编辑 2
基本上,我的解决办法就是重新安装所有东西(Python,Oracle Instant Client和cx_Oracle),这次是针对64位系统,而不是32位系统。
总结一下,这就是我的问题和解决方法: 1)我安装了32位Windows安装包的Cx_Oracle和32位的Oracle Instant Client,在我的64位系统上运行Python 2.7.5时一切正常。 2)我在一台虚拟机上做了完全相同的操作(同样是64位系统),但它不工作。 3)为了让它在虚拟机上工作,我重新安装了所有64位系统的东西(Python,Instant Client,Cx_Oracle),最后成功了。
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html http://sourceforge.net/projects/cx-oracle/files/5.1.2/
另外,确保下载与你的数据库版本相对应的cx_Oracle和Instant Client(在我这里是11g)。希望这能帮到你。
2 个回答
在我的情况下,我只需把 ORACLE_HOME 放在 Python 之前的路径变量里,这样就能正常工作了。
我在Windows 7上运行Oracle Express,并使用的是64位的Python 3.5。
下面是我如何让Django 1.9连接到Oracle数据库的步骤。
我通过pip安装了cx_Oracle,命令是(
pip3 install cx_Oracle
),而不是从pypi网站下载msi文件。我从这个网址(http://www.oracle.com/technetwork/topics/winx64soft-089540.html)下载了64位的Oracle即时客户端,并解压到C:\oraclexe(这样可以把所有Oracle相关的东西放在一个地方)。
我创建了以下环境变量:
set ORACLE_BASE=C:\oraclexe set ORACLE_HOME=C:\oraniclexe\app\oracle\product\11.2.0\server set PATH=C:\oraclexe\instantclient_11_2;%PATH%
我更新了Django的settings.py文件。
DATABASES = {
'default':{
'ENGINE':'django.db.backends.oracle',
'NAME':'XE',
'USER':'hr',
'PASSWORD':'hr',
'HOST':'localhost',
'PORT':'1521',
},
}
就这样。之后,我的Django迁移就正常工作了。