接口错误:无法获取Oracle环境句柄;Oracle\U HOME是正确的,SQL*Plus将连接

2024-10-01 09:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试导入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也是正确的。。。


Tags: 路径客户端标准错误notloadoraclemodule
3条回答

你在运行什么版本的Windows?是32位还是64位?

您的Oracle即时客户端是32位还是64位?

您的Python安装是32位还是64位?

您的cx_oracle是正确的版本吗?3264位?

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

    #!/usr/bin/env python2.7
    
  • env是编写可以在各种nx环境中运行的unix脚本的方便实用工具

  • 在OSX上(我使用的是macos 10.12 Sierra),出于某种原因,/usr/bin/env隐藏了一些在父进程中可见的系统变量-在这种情况下,DYLD_LIBRARY_PATH不会传输到子进程。测试:

    set|grep DYLD_LIBRARY_PATH
    DYLD_LIBRARY_PATH=.../oracle/instantclient_11_2
    
    env|grep DYLD_LIBRARY_PATH
    # nothing
    
  • 再来一张支票:

    python -c "import os; print os.environ.get('DYLD_LIBRARY_PATH')"
    .../instantclient_11_2:/usr/local/opt/openssl/lib
    
    # put the same line in first line of django-admin.py 
    # and you will get no output for DYLD_LIBRARY_PATH 
    
  • 有趣的是,在Linux(例如CentOS)上,情况并非如此,DYLD_LIBRARY_PATH和LD_LIBRARY_PATH在子进程中可见

  • 由于此cx_oracle.so无法加载所需的oracle库,因此失败并出现错误:

    Unable to acquire Oracle environment handle
    

解决方案是在django-admin.py中更改shebang:

  • 发件人:

    #!/usr/bin/env python2.7
    
  • 例如(检查python-venv安装:哪个python):

    #!.../venvs/project11/bin/python2.7
    
  • 它也像这样工作-但不如以前的解决方案灵活:

    #!/usr/bin/env DYLD_LIBRARY_PATH=<put-full-path->/instantclient_11_2 python2.7
    
  • 或者最简单的在使用cx Oracle或任何其他依赖DYLD库路径的模块时,不要在OSX中使用可重定位的virtualenv设置

我也遇到过同样的问题:您必须设置变量ORACLE_HOME以匹配您的Oracle客户机文件夹(例如,在Unix上:通过shell;在Windows上:如果配置面板的环境变量中不存在新变量,则创建新变量),因为这是cx_Oracle模块可以链接到它的方式。

你的文件夹$ORACLE_HOME/network/admin%ORACLE_HOME%\network\admin在Windows上)是你的tnsnames.ora文件应该存在的地方。

相关问题 更多 >