无法在Python 2.7和mac os 10.7.2上使用cx_Oracle - 缺少_OCIAttrGet

6 投票
5 回答
12672 浏览
提问于 2025-04-17 06:30

我在用Python 2.7和mac os 10.7.2(狮子系统)时,无法让cx_Oracle正常工作。

还有一件事:我安装的是32位的Oracle,不知道这样是否正确。

 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,我觉得这意味着它找不到某个库文件之类的东西。

我在网上看到有人提到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位版本。

5 个回答

2

在Mac OS 10.8.5上安装Oracle客户端,以便通过Python连接Oracle的步骤。(由于某些原因,64位版本在Mac OS 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. 这会在 /Users/<你的用户名>/ora_32/ 下创建一个名为 instantclient_11_2 的文件夹
  8. 进入 /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. http://cx-oracle.sourceforge.net 下载 cx_Oracle(仅源代码选项)
  11. 解压 cx_Oracle 的 tar 文件,这会创建一个 cx_Oracle-5.1.2 的文件夹,进入这个文件夹 cx_Oracle-5.1.2
  12. 运行下面的命令,这将安装 cx_Oracle,然后

     sudo easy_install cx_Oracle
    
  13. 你可以通过进入 Python 提示符并输入 import cx_Oracle 来检查是否安装成功
7

要让 cx_Oracle在OS X上运行,需要配置一些东西。重要的步骤有:

  1. 首先,创建一个虚拟环境,这个环境里的Python解释器要设置成只支持32位。在虚拟环境的bin目录下($WORKON_HOME/*虚拟环境名称*/bin):

    % mv python python.fat
    % lipo python.fat -remove x86_64 -output python
    
  2. 虽然现在的Python环境很简单,但它的配置还比较复杂,所以我们需要通过一个不太常见的环境变量来强制设置,这样distutils才能识别到:

    ARCHFLAGS="-arch i386" pip install cx_Oracle
    
2

如果你在使用苹果自带的 Python 2.7,它会优先以 64 位模式运行。如果你安装的 Oracle 库只有 32 位版本,这就会造成问题。你可以尝试强制让这个 Python 以 32 位模式运行,方法是这样启动它:

arch -i386 python2.7

如果你总是小心地通过 /usr/bin/python 来启动 Python,你也可以使用苹果的 man 页面上描述的任一方法,比如设置一个叫 VERSIONER_PYTHON_PREFER_32_BIT 的环境变量,或者通过 defaults 设置一个永久的默认值。

撰写回答