2011-11-16 74 views
0

在python脚本中导入cx_Oracle失败。用MacOSX导入cx_Oracle(python)

我安装了cx_Oracle,使用“pip install cx_oracle” - 工作正常,报告已安装。

现在,当我尝试:

import cx_Oracle 

我收到以下错误

Traceback (most recent call last): 
    File "reader.py", line 9, in <module> 
    import cx_Oracle 
ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Symbol not found: _OCIAttrGet 
    Referenced from: /Library/Python/2.7/site-packages/cx_Oracle.so 
    Expected in: flat namespace 
in /Library/Python/2.7/site-packages/cx_Oracle.so 

其他信息:

Python版本2.7/MAC OS 10.7.2(狮子)

$ python 
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin  
Type "help", "copyright", "credits" or "license" for more information. 

Oracle 10.2

$ sqlplus -version  
SQL*Plus: Release 10.2.0.4.0 - Production 

另外,我没有/ bin目录中的所有在我的ORACLE_HOME文件夹,只安装了即时客户端和SDK我有。

ox_Oracle

$ pip freeze 
PyRSS2Gen==1.0.0 
... 
cx-Oracle==5.1.1 

(发现了很多在获取安装cx_Oracle问题,但没有在这 - 感谢)

+0

我可能拥有它,并会发布我自己的答案,如果它是真的。我正在查看setup.py脚本,并注意到它使用文件夹名称来猜测版本。我在10.1文件夹中安装了10.2,可能是这个问题。 – nycynik

+0

好吧,我手动安装CX_ORACLE而不是使用pip,现在我有一个不同的,但基本相同的问题。文件“reader.py”,第9行,在 import cx_Oracle 文件“build/bdist.macosx-10.7-intel/egg/cx_Oracle.py”,第7行,在 文件“build/bdist.macosx-10.7 -intel/egg/cx_Oracle.py“,第6行,在__bootstrap__ ImportError:dlopen(/Users/me/.python-eggs/cx_Oracle-5.1.1-py2.7-macosx-10.7-intel.egg-tmp/ cx_Oracle.so,2):找不到符号:_OCIAttrGet – nycynik

回答

2

我今天遇到了这个问题,并能够通过将InstantClient二进制文件中引用的库的路径更改为文件系统上的实际位置来解决此问题。 这个博客http://blog.caseylucas.com/2013/03/03/oracle-sqlplus-and-instant-client-on-mac-osx-without-dyld_library_path/提供了详细的解释和调整所有二进制文件的脚本。唯一的问题是它使用了@executable_path,它似​​乎不再适用于Python 2.7 & El Capitan(我不确定对安全异常负责的是什么)。用实际路径替换@executable_path就行了。

总之,步骤,使其工作:

  • 安装InstantClient到/ usr /本地/ instantclient_11_2
  • 确保cx_Oracle.so共享对象,你用的是在/Library/Python/2.7 /site-packages/cx_Oracle.so
  • 下面的脚本复制到/ usr /本地/ instantclient_11_2

    #!/bin/sh 
    # script to change the dynamic lib paths and ids for oracle instant client 
    # exes and libs 
    (echo /Library/Python/2.7/site-packages/cx_Oracle.so ; find . -maxdepth 1 -type f \(-perm -1 -o \(-perm -10 -o -perm -100 \) \) -print) | while read exe 
    do 
        echo adjusting executable $exe 
        baseexe=`basename $exe` 
        otool -L $exe | awk '/oracle/ {print $1}' | while read lib 
        do 
         echo adjusting lib $lib 
         baselib=`basename $lib` 
         if [ "$baseexe" = "$baselib" ] 
         then 
          echo changing id to $baselib for $exe 
          install_name_tool -id $baselib $exe 
         else 
          echo changing path id for $lib in $exe 
          install_name_tool -change $lib /usr/local/instantclient_11_2/$baselib $exe 
         fi 
        done 
    done 
    
    • 以root权限运行脚本。
-1

卸载一切。

然后安装Oracle即时客户端:

然后使用PIP安装cx_oracle。

然后将路径设置为指向预言的32位版本。在你的home目录

  • 编辑.profile文件和路径添加到您的Oracle斌家中,使用该行:
  • 出口PATH = $ PATH:在/ usr/local/lib目录/ instantclient/

它的工作原理...

+1

和“设置mac os使用32位模式”的魔法词会是? – ThatAintWorking

+0

我所做的是安装了32位模式的oracle版本,并将路径指向该目录。 – nycynik

+0

如何在第一个地方在Mac上安装Oracle客户端? – trojanfoe