其实安装的步骤是非常简单的,按照其他博客的安装:
http://thelaziestprogrammer.com/sharrington/databases/oracle/install-cx_oracle-mac
你可以很快的完成。但我的版本是MacOs Sierra,无论怎么安装死活都是:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Library not loaded: @rpath/libclntsh.dylib.12.1
Referenced from: /Library/Python/2.7/site-packages/cx_Oracle.so
Reason: image not found
怎么解决这个问题?
首先,cx_Oracle.so是一个库,会动态连接很多文件,libclntsh.dylib.12.1就是其中一个,我们可以使用otool命令, -L和-l参数查看该文件的dependency:
otool -L /Library/Python/2.7/site-packages/cx_Oracle.so
/Library/Python/2.7/site-packages/cx_Oracle.so:
@rpath/libclntsh.dylib.12.1 (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
otool -l /Library/Python/2.7/site-packages/cx_Oracle.so
/Library/Python/2.7/site-packages/cx_Oracle.so:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777223 3 0x00 8 14 1416 0x00000085
...
Load command 9
cmd LC_LOAD_DYLIB
cmdsize 56
name @rpath/libclntsh.dylib.12.1 (offset 24)
time stamp 2 Thu Jan 1 08:00:02 1970
current version 0.0.0
compatibility version 0.0.0
Load command 10
cmd LC_LOAD_DYLIB
cmdsize 56
name /usr/lib/libSystem.B.dylib (offset 24)
time stamp 2 Thu Jan 1 08:00:02 1970
current version 1238.60.2
compatibility version 1.0.0
Load command 11
cmd LC_FUNCTION_STARTS
cmdsize 16
dataoff 132856
datasize 424
Load command 12
cmd LC_DATA_IN_CODE
cmdsize 16
dataoff 133280
datasize 32
从otool -l的命令输出里面,我们没有找到类似的打印:
Load command 13
cmd LC_RPATH
cmdsize 48
path /usr/local/opt/instantclient_12_1/ (offset 12)
这表示@rpath对应的LC_RPATH没有在编译cx_Oracle.so的时候加入到包中,那么我们就手动加:
install_name_tool -add_rpath /usr/local/opt/instantclient_12_1/ /Library/Python/2.7/site-packages/cx_Oracle.so