我在尝试导入cx_Oracle时遇到标准的“DLL load failed;module not found”错误。我已经安装了正确的即时客户端,路径都是正确的。。。运行依赖项Walker会告诉我缺少以下.dll MSVCR90、GPSVC和IESHIMS。
我正在运行Oracle11g和Python2.7的即时客户端。有人有什么想法吗?我发现的大多数答案都包含一条错误的路径,但事实似乎并非如此。。。另外,在我的系统上找不到其他任何.dll文件。
编辑: 我最终安装了Oracle XE 11g(32位);Python 2.7和cx_Oracle也都是32位的(我还应该说我是在Windows上)。cx_Oracle现在安装得很干净;但是在连接时,我收到一个错误:
InterfaceError: Unable to acquire Oracle environment handle
ORACLE U HOME路径是正确的,路径文件夹中的bin也是正确的。。。
你在运行什么版本的Windows?是32位还是64位?
您的Oracle即时客户端是32位还是64位?
您的Python安装是32位还是64位?
您的cx_oracle是正确的版本吗?32或64位?
MVCR90.DLL是微软Visual C++ 2008 SP1可重分发软件包的一部分。
32位版本可用here,64位版本可用here。
IESHIMS.dll将位于
C:\Program Files\Internet Explorer\Ieshims.dll
(32位Windows位置或64位Windows位置)或C:\ Program Files\Internet Explorer(x86)IESHIMS.dll`(64位Windows上的32位Windows位置),如果您的Windows版本是Vista或更高版本。GPSVC.dll应该位于
C:\Windows\System32
中。依赖项Walker将这最后两个DLL报告为丢失,因为Windows错误报告使用IEFrame.DLL并延迟加载,这意味着它们可能永远不需要。
我发现,为了让cx_oracle干净地导入,您需要确保其依赖项的版本匹配。您还需要确保Oracle客户端安装与您的
ORACLE_HOME
匹配,并且您的路径变量包含%ORACLE_HOME%/bin
,它被设置为环境变量或在注册表中,并且您的tnsnames.ora文件位于TNS_ADMIN设置为的值中。如Emmanuel的答案中所述,未设置的TNS_管理设置的默认值是%ORACLE_HOME%\network\admin
。我也很少使用oracle安装程序的即时客户端版本,除非绝对必要,因为与其他版本不同,它没有设置总是确保设置或维护了路径、oracle\U HOME或TNS\U ADMIN正确,这导致找不到tnsnames.ora和OCI.dll。当同一台计算机上有多个Python版本或Oracle版本时,这会变得更加复杂。
要显式设置它们,可以使用环境变量(用户或系统),这些变量位于“控制面板”中的“系统”图标、“高级系统设置”任务、“高级”选项卡、“环境”按钮下。
关于
InterfaceError: Unable to acquire Oracle environment handle
,当与不解析OCI.dll相反时,这种情况会特别发生,cx悻Oracle不知道要使用哪个OCI.dll,通常情况下是这样的,因为PATH变量包含两个或多个包含OCI.dll的搜索目录。特别是确保您的路径只包含即时客户端安装或Oracle 11G XE安装中的OCI.dll的一个瞬间,应该可以解决您的问题。
在安装Oracle11gXe之前是否卸载了即时客户端?
在命令提示中粘贴以下内容。
echo The current ORACLE_HOME is %ORACLE_HOME%
echo The current TNS_ADMIN is %TNS_ADMIN%
echo The current PATH is %PATH%
查看这些变量的当前值。
更多资源
我在我的案例中发现的是:
处于可重定位模式(--relocatable)的virtualenv安装程序使用/usr/bin/env实用程序作为django-admin.py的shebang:
env是编写可以在各种nx环境中运行的unix脚本的方便实用工具
在OSX上(我使用的是macos 10.12 Sierra),出于某种原因,/usr/bin/env隐藏了一些在父进程中可见的系统变量-在这种情况下,DYLD_LIBRARY_PATH不会传输到子进程。测试:
再来一张支票:
有趣的是,在Linux(例如CentOS)上,情况并非如此,DYLD_LIBRARY_PATH和LD_LIBRARY_PATH在子进程中可见
由于此cx_oracle.so无法加载所需的oracle库,因此失败并出现错误:
解决方案是在django-admin.py中更改shebang:
发件人:
例如(检查python-venv安装:哪个python):
它也像这样工作-但不如以前的解决方案灵活:
或者最简单的在使用cx Oracle或任何其他依赖DYLD库路径的模块时,不要在OSX中使用可重定位的virtualenv设置
我也遇到过同样的问题:您必须设置变量
ORACLE_HOME
以匹配您的Oracle客户机文件夹(例如,在Unix上:通过shell;在Windows上:如果配置面板的环境变量中不存在新变量,则创建新变量),因为这是cx_Oracle
模块可以链接到它的方式。你的文件夹
$ORACLE_HOME/network/admin
(%ORACLE_HOME%\network\admin
在Windows上)是你的tnsnames.ora
文件应该存在的地方。相关问题 更多 >
编程相关推荐