【问题标题】:cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle Maccx_Oracle.InterfaceError: 无法获取 Oracle 环境句柄 Mac
【发布时间】:2017-08-17 19:57:48
【问题描述】:

我已经安装了 cx_Oracle 并且可以成功导入它。但是当我尝试建立 Oracle 连接时,我得到了这个错误:

Traceback (most recent call last): File "<stdin>", line 1, in <module> cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle

我的操作系统是 MacOSX,我的 ORACLE_HOME 指向 Instantclient_11_2。

【问题讨论】:

    标签: python oracle cx-oracle


    【解决方案1】:

    第一件事。

    检查您的 cx_oracle 是否构建为与您的 Oracle 客户端完全相同的版本。

    import cx_Oracle
    cx_Oracle.clientversion()
    

    这应该返回它期望找到的版本。

    如果版本不同,您应该根据正确的版本重新构建它。

    【讨论】:

    • 我得到了 (11, 2, 0, 3, 0),这是正确的版本。
    • @rijo-simon 好的,您是否尝试过任何相关问题的解决方案?
    • 是的,几乎都试过了。没有一个解决方案提供了解决方案。
    • 您使用的是哪个版本的 cx_oracle?一些早期版本在检测 InstantClient 时存在一些问题。还有你是用什么方法安装的?
    【解决方案2】:

    对于即时客户端,不要设置 ORACLE_HOME。请遵循以下说明:

    cd $HOME
    mkdir -p lib
    cd lib
    cp /the/location/to/instantclient_11_2/*dylib* .
    ln -s libclntsh.dylib.11.1 libclntsh.dylib
    

    如果您能够使用 Instant Client 12.1,事情会简单一些

    cd $HOME
    mkdir -p lib
    cd lib
    ln -s /the/location/to/instantclient_12_1/libclntsh.dylib.12.1 libclntsh.dylib
    

    如果您还下载并解压 SQL*Plus 包,您可以验证您的客户端安装是否正常工作。

    【讨论】:

    • 我做了上述步骤,但没有帮助。在这种情况下,ORACLE_HOME 应该是什么?
    • ORACLE_HOME 根本不应该下注。
    • 取消设置 ORACLE_HOME 没有帮助。问题依然存在。
    • 看起来 macOS 上的 Instant Client 11.2 的行为方式与 macOS 上的 Instant Client 12.1 不同。我已经相应地更新了说明并验证了它是否有效——至少对我来说是这样!
    • 我建议的更改是否帮助您解决了问题?
    【解决方案3】:

    您是否尝试过修复您的连接方式?听起来您设置正确。

    请尝试以下方法(填写您自己的信息):

    ip_addr = 'ip address'
    port = 1521
    sid = 'sid'
    dsn_tns = cx_Oracle.makedsn(ip_addr, port, sid)
    db = cx_Oracle.connect('username', 'password', dsn_tns)
    

    如果这不起作用,请确保您的LD_LIBRARY_PATH 设置正确。

    【讨论】:

    • 它适用于“localhost”、环回和公共 ip,但它仍然不适用于 django。 :-(
    • 如果它适用于除 django 之外的所有内容,则可能是 django 使用的任何端口的权限问题。
    • 我在通过 supervisord 运行 gunicorn 时遇到了这个问题,但是当我在终端上手动运行 gunicorn 时它可以工作。
    • 我不知道 gunicorn 或 supervisord 是什么,但 supervisord 可能缺乏适当的权限。您可能想检查 supervisord 以什么用户身份运行并检查该用户的权限。
    • 它也不适用于主管配置中的 root 用户。
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多