用MacOSX导入cx_Oracle(python)
在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问题,但没有在这 - 感谢)
我今天遇到了这个问题,并能够通过将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权限运行脚本。
卸载一切。
然后安装Oracle即时客户端:
然后使用PIP安装cx_oracle。
然后将路径设置为指向预言的32位版本。在你的home目录
- 编辑.profile文件和路径添加到您的Oracle斌家中,使用该行:
- 出口PATH = $ PATH:在/ usr/local/lib目录/ instantclient/
它的工作原理...
和“设置mac os使用32位模式”的魔法词会是? – ThatAintWorking
我所做的是安装了32位模式的oracle版本,并将路径指向该目录。 – nycynik
如何在第一个地方在Mac上安装Oracle客户端? – trojanfoe
我可能拥有它,并会发布我自己的答案,如果它是真的。我正在查看setup.py脚本,并注意到它使用文件夹名称来猜测版本。我在10.1文件夹中安装了10.2,可能是这个问题。 – nycynik
好吧,我手动安装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