无法让cx_Oracle与Python版本2.7 / mac os 10.7.2(Lion)一起使用 - missing_OCIAttrGet

时间:2011-11-17 15:40:44

标签: python macos python-2.7

无法让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位版本。

5 个答案:

答案 0 :(得分:6)

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
    

答案 1 :(得分:2)

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

arch -i386 python2.7

如果你总是小心地通过/usr/bin/python启动python,你也可以使用Apple的man页面中描述的Python中的任何一种方法,即设置VERSIONER_PYTHON_PREFER_32_BIT环境变量或设置通过defaults永久默认。

答案 2 :(得分:2)

不确定你是否仍然遇到这个问题,但这就是我如何让它发挥作用。

我按照此处列出的说明(使用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):找不到符号:_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

答案 3 :(得分:2)

安装到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 /&lt;下创建新文件夹您的用户名&gt; / ora_32(您可以命名您想要的名称)
  5. 移动zip文件instantclient-sdk-macos.x32-11.2.0.3.0.zip和 instantclient-basic-macos.x32-11.2.0.3.0.zip to /用户/&LT;您的用户名&gt; / 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  /用户// ora_32 /
  8. cd to / Users /&lt;您的用户名&gt; / 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
  14. 进行检查

答案 4 :(得分:0)

我有同样的问题。我正在使用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犹豫不决。