【问题标题】:How to install cx_Oracle on El Capitan如何在 El Capitan 上安装 cx_Oracle
【发布时间】:2016-01-20 11:18:50
【问题描述】:

据我了解,与 SIP 相关的一些变化使得安装变得困难。

这些页面有安装的背景和建议。 http://sourceforge.net/p/cx-oracle/mailman/message/34534872/, http://stefanoapostolico.com/2015/10/08/install_cx_oracle_with_sip_enabled.html

把所有这些放在一起,这是我最好的将它安装到我的 virtualenv 的机会,但是唉,仍然没有好处。

我得到的错误是:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: dlopen(/Users/me/sx_direct_env/lib/python2.7/site-packages/cx_Oracle.so, 2): Library not loaded: /b/227/rdbms/lib/libclntsh.dylib.10.1
  Referenced from: /Users/me/sx_direct_env/lib/python2.7/site-packages/cx_Oracle.so
  Reason: image not found

以下是我的所有安装步骤:

$ cd /Users/me/sx_direct_env/lib/python2.7
$ mkdir oracle
$ cd oracle
$ export ORACLE_HOME=$PWD
$ export DYLD_LIBRARY_PATH=$ORACLE_HOME
$ export LD_LIBRARY_PATH=$ORACLE_HOME
$ export PATH=$PATH:$ORACLE_HOME
$ unzip ~/Downloads/instantclient-basic-macos.x64-11.2.0.4.0.zip
$ unzip ~/Downloads/instantclient-sdk-macos.x64-11.2.0.4.0.zip
$ mv instantclient_11_2/* .
$ rmdir instantclient_11_2
$ curl -O https://raw.githubusercontent.com/kubo/fix_oralib_osx/master/fix_oralib.rb
$ ruby -a fix_oralib.rb 
adrci:
   add rpath: @loader_path
   change install name
     from: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
       to: @rpath/libclntsh.dylib.11.1
   change install name
     from: /ade/dosulliv_ldapmac/oracle/ldap/lib/libnnz11.dylib
       to: @rpath/libnnz11.dylib

genezi:
   add rpath: @loader_path
   change install name
     from: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
       to: @rpath/libclntsh.dylib.11.1

libclntsh.dylib.11.1:
   add rpath: @loader_path
   change identification name
     from: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
       to: @rpath/libclntsh.dylib.11.1
   change install name
     from: /ade/dosulliv_ldapmac/oracle/ldap/lib/libnnz11.dylib
       to: @rpath/libnnz11.dylib

libnnz11.dylib:
   change identification name
     from: /ade/dosulliv_ldapmac/oracle/ldap/lib/libnnz11.dylib
       to: @rpath/libnnz11.dylib

libocci.dylib.11.1:
   change identification name
     from: /ade/b/3071542110/oracle/rdbms/lib/libocci.dylib.11.1
       to: @rpath/libocci.dylib.11.1

libociei.dylib:
   add rpath: @loader_path
   change install name
     from: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
       to: @rpath/libclntsh.dylib.11.1

libocijdbc11.dylib:
   add rpath: @loader_path
   change install name
     from: /ade/b/2475221476/oracle/rdbms/lib/libclntsh.dylib.11.1
       to: @rpath/libclntsh.dylib.11.1
   change install name
     from: /ade/b/2475221476/oracle/ldap/lib/libnnz11.dylib
       to: @rpath/libnnz11.dylib

uidrvci:
   add rpath: @loader_path
   change install name
     from: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
       to: @rpath/libclntsh.dylib.11.1
   change install name
     from: /ade/dosulliv_ldapmac/oracle/ldap/lib/libnnz11.dylib
       to: @rpath/libnnz11.dylib

$ pip install cx_oracle
Collecting cx-oracle
Installing collected packages: cx-oracle
Successfully installed cx-oracle-5.2

$ python -c "import cx_Oracle"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: dlopen(/Users/me/sx_direct_env/lib/python2.7/site-packages/cx_Oracle.so, 2): Library not loaded: /b/227/rdbms/lib/libclntsh.dylib.10.1
  Referenced from: /Users/me/sx_direct_env/lib/python2.7/site-packages/cx_Oracle.so
  Reason: image not found

【问题讨论】:

  • 嗨,格雷格,但您是否运行过“cxOracleSIP.sh”?因为您面临的是 OSX 安全问题,而不是 Oracle 客户端问题。问候
  • 谢谢。我相信 fix_oralib.rb 也可以进行安全修复。我正在研究的一个想法是 pip 没有安装最新版本。
  • 如果您使用直接的 Instant Client 12.1 库,应该没有 SIP 问题。只需在安装 cx_Oracle 之前设置环境变量 FORCE_RPATH=1。
  • 另外,LD_LIBRARY_PATH 是 Linux 的东西,由于 SIP 问题,没有使用 DY_LIBRARY_PATH。所以不需要设置这些变量。

标签: python oracle macos cx-oracle osx-elcapitan


【解决方案1】:

我想我修好了。基本上我上面发布的步骤中的所有内容都是正确的。

但我最终将它用于 pip 安装,以确保它拉下新副本并重新构建(并且可能获得更高版本??)

$ pip install --no-cache-dir --allow-external --allow-unverified cx_oracle

然后我可以毫无问题地导入 cx_oracle,但在连接到外部服务器时出现错误“'ORA-21561: OID generation failed'”。

然后我按照instructions here 将我的主机名添加到 /etc/hosts 文件中,现在一切正常。

例如,在 /etc/hosts 的末尾添加这样的一行

127.0.0.1 localhost 我的主机名

【讨论】:

    【解决方案2】:

    感谢格雷格的指导。

    我必须为我的 cx_Oracle pip 安装创建一个符号链接才能工作(使用您在上面提供的参数)。您可能需要将这些添加到您的说明中。

    ln -s libclntsh.dylib.11.1 libclntsh.dylib
    

    我还按照本安装指南的建议为 libocci 创建了另一个链接:https://gist.github.com/thom-nic/6011715

    ln -s libocci.dylib.11.1 libocci.dylib
    

    【讨论】:

    • FWIW,cx_Oracle 不使用 C++,因此您不需要 libocci 符号链接。您只需要 libclntsh 链接。
    【解决方案3】:

    我在尝试使用 Oracle instantclient 12.1 安装 cx_Oracle 时遇到了以下错误:

    [535]: /opt/instantclient_12_1 $ python -c "import cx_Oracle"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): 
            Library not loaded: @rpath/libclntsh.dylib.12.1
      Referenced from: /Library/Python/2.7/site-packages/cx_Oracle.so
      Reason: image not found
    

    注意错误中的 @rpath - 事实证明,在 El Capitan 上构建 cx_Oracle 库(对于 Instantclient 12.1) 时,gcc 编译器需要 -rpath设置标志以知道在哪里可以找到上述动态链接库 (*.dylib)。默认情况下,在 Instantclient 12.1 上,pip 不会为您执行此操作。

    # Set -rpath option before installing...this will use $ORACLE_HOME during compilation
    export FORCE_RPATH=TRUE
    pip install cx_Oracle
    # And verify cx_Oracle was correctly installed
    python -c "import cx_Oracle"
    # If this line fails install cx_Oracle with:
    #   pip install --no-cache-dir --allow-external --allow-unverified cx_oracle
    

    python -c "import cx_Oracle" 应该不会报告错误。

    如需完整的安装指南(包括即时客户端下载和配置),请查看我在http://thelaziestprogrammer.com/sharrington/databases/oracle/install-cx_oracle-mac 的帖子了解详细信息。

    【讨论】:

    • 如果您在安装前使用 Instant Client 12.1 库和export FORCE_RPATH=1,应该不会有任何 SIP 问题。如果你检查 cx_Oracle 的 setup.py,你可以看到这个变量导致 -rpath 被添加到链接行。
    • 验证 Instantclient 12.1 没有 SIP 问题,只要您在运行 pip install cx_Oracle 之前运行 export FORCE_RPATH=1。上面的答案基本上做了 pip 会做的事情...the linked post above 也已更新。
    • 链接帖子上的一些简化/cmets:(i) cx_Oracle 使用 OCI 而不是 OCCI,因此技术上不需要 libocci 符号链接 (ii) ORACLE_HOME 仅在 setup.py 期间使用安装,所以你不需要它在 .bashrc 中。一般情况下,使用 Instant Client 时不应设置 ORACLE_HOME,但 cx_Oracle 会超载使用并需要它进行安装 (iii) 由于使用 rpath,您无需设置 DYLD_LIBRARY_PATH。希望这些帮助使它变得更简单。
    • linked post 已经更新了以上所有 3 条建议。文章底部的@ChristopherJones 也受到了赞扬。
    • 升级到 Sierra 后开始出现错误。通过设置FORCE_RPATH=1,卸载并重新安装pip install --no-cache-dir --allow-external --allow-unverified cx_oracle(注意我必须使用所有这些选项。只是进行正常安装并没有这样做。现在工作。谢谢!
    【解决方案4】:

    要在 OS X 上安装 cx_Oracle,请从http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html 下载适用于 OS X 的 64 位 Instant Client 基本和 sdk 包。使用此版本的 Instant Client,您可以连接到 10g、11g 和 12c 数据库。此版本的链接方式可以避免 Apple 最近引入的 SIP 问题(影响 Instant Client 11.2)。

    然后运行类似:

    unzip instantclient-basic-macos.x64-12.1.0.2.0.zip
    unzip instantclient-sdk-macos.x64-12.1.0.2.0.zip
    cd instantclient_12_1
    ln -s libclntsh.dylib.12.1 libclntsh.dylib
    cd ..
    export ORACLE_HOME=`pwd`/instantclient_12_1
    export FORCE_RPATH=1
    pip install cx_Oracle
    

    您可能需要也可能不需要其他点子选项,如 https://stackoverflow.com/a/33284974/4799035 中所述

    【讨论】:

      【解决方案5】:

      另请注意: 如果您的 python 以 32 位运行,并将 cx_Oracle 安装为 64 位,您也会遇到此问题。 为避免此问题,请始终以超级用户“su”身份运行您的命令,并明确“su”python 是 32 位还是 64 位。 检查你的python位How do I determine if my python shell is executing in 32bit or 64bit mode on OS X?

      强制使用 64 位运行:

      arch -x86_64 /usr/bin/python27

      强制使用 32 位运行:

      默认写入 com.apple.versioner.python Prefer-32-Bit -bool yes

      【讨论】:

        猜你喜欢
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 2018-06-19
        • 1970-01-01
        • 2018-05-02
        • 2016-03-29
        相关资源
        最近更新 更多