无法让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
第二次编辑
实际上无论我安装什么,它都不是正确的版本.. 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位版本。
答案 0 :(得分:6)
要compile cx_Oracle so it'll work on OS X需要配置几件事。重要的一点是:
使用仅剥离为32位的python解释器创建virtualenv。在virtualenv bin目录($WORKON_HOME/*name_of_virtualenv*/bin
)中:
% mv python python.fat
% lipo python.fat -remove x86_64 -output python
尽管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)
移动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/
解压缩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
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
导出当前会话的环境变量 或者您可以在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
运行以下命令,它将安装cx_Oracle,然后
sudo easy_install cx_Oracle
答案 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犹豫不决。