2011-11-16 99 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