【问题标题】:Can't get cx_Oracle to work with Python version 2.7 / mac os 10.7.2 (Lion) - missing_OCIAttrGet无法让 cx_Oracle 与 Python 版本 2.7 / mac os 10.7.2 (Lion) 一起使用 - missing_OCIAttrGet
【发布时间】:2011-12-31 11:32:12
【问题描述】:

无法让 cx_Oracle 与 Python 2.7 版/mac os 10.7.2 (Lion) 一起工作

另外一件事:我安装了 oracle 32 位,不确定是否正确。

 Traceback (most recent call last):
      File "reader.py", line 9, in <module>
        import cx_Oracle
      File "build/bdist.macosx-10.7-intel/egg/cx_Oracle.py", line 7, in <module>
      File "build/bdist.macosx-10.7-intel/egg/cx_Oracle.py", line 6, in __bootstrap__
    ImportError: dlopen(/Users/me/.python-eggs/cx_Oracle-5.1.1-py2.7-macosx-10.7-intel.egg-tmp/cx_Oracle.so, 2): Symbol not found: _OCIAttrGet
      Referenced from: /Users/me/.python-eggs/cx_Oracle-5.1.1-py2.7-macosx-10.7-intel.egg-tmp/cx_Oracle.so
      Expected in: flat namespace
     in /Users/me/.python-eggs/cx_Oracle-5.1.1-py2.7-macosx-10.7-intel.egg-tmp/cx_Oracle.so

他们的关键问题似乎是无法找到_OCIAttGet,我认为这意味着它无法找到一个lib文件或其他东西。

在网上找到,有人在说DYLD_LIBRARY_PATH,但是我的已经设置好了,但是他在cxoracle.cfg文件中提到了,我找不到,这是我的问题吗?

编辑

在尝试使用 32 位模式 python 运行它后,我看到一个不同的错误。

 Traceback (most recent call last):
   File "reader.py", line 9, in <module>
     import cx_Oracle
   File "build/bdist.macosx-10.7-intel/egg/cx_Oracle.py", line 7, in <module>
   File "build/bdist.macosx-10.7-intel/egg/cx_Oracle.py", line 3, in __bootstrap__
 ImportError: No module named pkg_resources
  • 我无法在我的计算机上运行 oracle 64 位版本,运行 sqlplus 时不断出现分段错误,这就是我使用 32 的原因。

二次编辑

其实无论我安装什么,都不是正确的版本.. 32位版本

 ld: warning: ignoring file /opt/oracle/instantclient10_2/libclntsh.dylib, file was built for unsupported file format which is not the architecture being linked (i386)

64 位版本:

 ld: warning: ignoring file /opt/oracle/instantclient10_2/libclntsh.dylib, file was built for unsupported file format which is not the architecture being linked (x86_64)

我将尝试 11g,但它只有 64 位版本。

【问题讨论】:

    标签: python macos python-2.7


    【解决方案1】:

    compile cx_Oracle so it'll work on OS X 需要配置一些东西。重要的一点是:

    1. 使用仅剥离为 32 位的 python 解释器创建一个 virtualenv。在 virtualenv 的 bin 目录下($WORKON_HOME/*name_of_virtualenv*/bin):

      % mv python python.fat
      % lipo python.fat -remove x86_64 -output python
      
    2. 尽管 Python 现在很瘦,但它的配置不是,所以我们需要使用 distutils 将拾取的模糊环境变量来强制执行:

      ARCHFLAGS="-arch i386" pip install cx_Oracle
      

    【讨论】:

    • 谢谢!这解决了我的问题,我的头撞得太久了。
    • 这很棒,因为它适用于运行自己运行 python 的服务器(如烧瓶)。
    【解决方案2】:

    如果您使用的是 Apple 提供的 Python 2.7,它会更喜欢在 64 位模式下运行,如果您确实安装了仅 32 位的 Oracle 库,这将是一个问题。您可以尝试通过这种方式启动它来强制 Python 在 32 位模式下运行:

    arch -i386 python2.7
    

    如果您小心始终通过/usr/bin/python 启动python,您也可以使用Apple 的man 页面中描述的任何一种方法,即设置VERSIONER_PYTHON_PREFER_32_BIT 环境变量或通过@987654325 设置永久默认值@。

    【讨论】:

    • 当我用 PIPld 重新安装 cx_Oracle 时,我得到了:警告:忽略文件 /opt/oracle/instantclient10_2/libclntsh.dylib,文件是为不受支持的文件格式构建的,它不是被链接的体系结构 (x86_64)
    • 但是尽管有警告信息,它仍然有效吗?有时会出现令人困惑的消息,因为 OS X 通用文件在同一个文件中包含多个体系结构的可执行文件。
    • 不,python 仍然失败并出现同样的错误。未找到符号:_OCIAttrGet 引用自:/Library/Python/2.7/site-packages/cx_Oracle.so 预期位于:/Library/Python/2.7/site-packages/cx_Oracle.so 中的平面命名空间
    • 使用arch -i386 python2.7 给了我与@nycynik 相同的错误。但是,导出 VERSIONER_PYTHON_PREFER_32_BIT 变量并简单地使用 python 对我有用。
    • 谢谢,这让我意识到当我需要 64 位库(OSX 10.11.2)时,我错误地下载了 32 位库。一旦我重新下载了 64 位 (basic+sdk),我必须做 pip uninstall cx_Oracle 并重新安装它。之后,效果很好。
    【解决方案3】:

    不确定您是否仍然遇到此问题,但这是我如何让它工作的。

    我按照此处列出的说明进行操作(使用 Oracle 的 32 位下载): http://www.xairon.net/2011/05/guide-installing-cx_oracle-on-mac-os-x/

    然后我遇到了您列出的相同错误:

    ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Symbol not found: _OCIAttrGet 引用自:/Library/Python/2.7/site-packages/cx_Oracle.so 预期在:平面命名空间 在 /Library/Python/2.7/site-packages/cx_Oracle.so

    问题出在 Apple 的 Python 发行版默认以 64 位模式运行。

    一旦我强迫 Apple 提供的 Python 使用 32 位(根据 Ned 的建议),它就奏效了!

    这样做:

    $export VERSIONER_PYTHON_PREFER_32_BIT=是

    使其永久化:

    $defaults write com.apple.versioner.python Prefer-32-Bit -bool yes

    【讨论】:

    • 我还是有这个问题!谢谢,试试看!
    • 明确检查您运行的是 64 位 Python 还是 32 位 Python 可能会有所帮助。使用列出的技术here 这样做。
    • 谢谢@NathanJones!做到了。即使我导出 VERSIONER_PYTHON_PREFER_32_BIT=Yes 我实际上仍在以 64 位模式运行 python。当我使用“arch -i386 python”时它起作用了!!!
    【解决方案4】:

    在 mac ox 10.8.5 上安装到 oracle 客户端以从 python 连接 oracle 的步骤。 (由于 64 位不适用于 mac ox 10.8.5 存在错误)

    1. 转到http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html
    2. 下载instantclient-basic-macos.x32-11.2.0.3.0.zip
    3. 下载instantclient-sdk-macos.x32-11.2.0.3.0.zip
    4. 在/Users//ora_32下创建新文件夹(你可以随意命名)
    5. 移动 zip 文件 Instantclient-sdk-macos.x32-11.2.0.3.0.zip 和 Instantclient-basic-macos.x32-11.2.0.3.0.zip 到 /Users//ora_32 下面的命令

      mv insta*32* /Users/< your username>/ora_32/
      
    6. 解压缩 Instantclient-basic-macos.x32-11.2.0.3.0.zip 和 Instantclient-sdk-macos.x32-11.2.0.3.0.zip 下面的命令

      cd /Users/< your username>/ora_32/
      unzip instantclient-basic-macos.x32-11.2.0.3.0.zip
      unzip instantclient-sdk-macos.x32-11.2.0.3.0.zip
      
    7. 它会在下面创建一个文件夹 instantclient_11_2 /Users//ora_32/
    8. cd 到 /Users//ora_32/instantclient_11_2 并创建以下符号链接 会在安装cx_Oracle时用到。(下面会提到)

      ln -s libclntsh.dylib.11.1 libclntsh.dylib
      ln -s libocci.dylib.11.1 libocci.dylib
      
    9. 导出当前会话的环境变量 或者您可以将它们添加到 bash 配置文件中以在每次打开时调用 一个新的终端。

      export ORACLE_HOME=/Users/<your username>/ora_32/instantclient_11_2
      export LD_LIBRARY_PATH=$ORACLE_HOME
      export DYLD_LIBRARY_PATH=$ORACLE_HOME
      export VERSIONER_PYTHON_PREFER_32_BIT=yes
      export PATH=$PATH:/Users/<your username>/ora_32/instantclient_11_2
      
    10. 下载 cx_Oracle(仅选项源代码) 在链接http://cx-oracle.sourceforge.net
    11. 解压 cx_Oracle tar 文件,它将创建一个 cx_Oracle-5.1.2 文件夹 cd 到那个文件夹 cx_Oracle-5.1.2
    12. 运行以下命令将安装 cx_Oracle 然后

       sudo easy_install cx_Oracle
      
    13. 您可以转到 python 提示符并键入 import cx_Oracle 来检查

    【讨论】:

    • “仅选项源代码”是什么意思?我没有办法做到这一点。
    • 我遵循的大多数安装步骤都是相似的,但我得到了一个错误。缺少的步骤是 export PATH=$PATH:/Users//ora_32/instantclient_11_2
    【解决方案5】:

    我遇到了同样的问题。我使用的是 Mac OS X 10.8.3。

    在尝试了各种解决方案4小时后,我终于意识到这是安装了32位版本的Oracle InstantClient的结果,与64位版本的python冲突。

    解决:我卸载了 python(和一些依赖项),然后重新安装了通用版本。我按照这篇文章中的说明从我的 virtualenv 中的 python 二进制文件中删除了 x86_64。这允许 32 位 Oracle InstantClient 与 32 位 python 二进制文件一起工作。

    我对使用 64 位 Oracle InstantClient 犹豫不决,因为我在研究此问题时看到了一些其他帖子。

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2012-01-06
      • 2012-08-17
      • 2011-12-17
      • 1970-01-01
      • 2012-02-22
      • 2011-10-27
      • 2012-02-12
      相关资源
      最近更新 更多