无法在Python 2.7和mac os 10.7.2上使用cx_Oracle - 缺少_OCIAttrGet
我在用Python 2.7和mac os 10.7.2(狮子系统)时,无法让cx_Oracle正常工作。
还有一件事:我安装的是32位的Oracle,不知道这样是否正确。
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
,我觉得这意味着它找不到某个库文件之类的东西。
我在网上看到有人提到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
- 我无法在我的电脑上运行Oracle的64位版本,运行sqlplus时总是出现段错误,所以我才使用32位的。
第二次编辑
实际上,无论我安装什么,似乎都不是正确的版本……是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位版本。
5 个回答
在Mac OS 10.8.5上安装Oracle客户端,以便通过Python连接Oracle的步骤。(由于某些原因,64位版本在Mac OS 10.8.5上无法使用)
- 访问 http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html
- 下载 instantclient-basic-macos.x32-11.2.0.3.0.zip
- 下载 instantclient-sdk-macos.x32-11.2.0.3.0.zip
- 在 /Users/<你的用户名>/ 下创建一个新文件夹,命名为 ora_32(你可以随意命名)
将下载的 zip 文件 instantclient-sdk-macos.x32-11.2.0.3.0.zip 和 instantclient-basic-macos.x32-11.2.0.3.0.zip 移动到 /Users/<你的用户名>/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
- 这会在 /Users/<你的用户名>/ora_32/ 下创建一个名为 instantclient_11_2 的文件夹
进入 /Users/<你的用户名>/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
- 在 http://cx-oracle.sourceforge.net 下载 cx_Oracle(仅源代码选项)
- 解压 cx_Oracle 的 tar 文件,这会创建一个 cx_Oracle-5.1.2 的文件夹,进入这个文件夹 cx_Oracle-5.1.2
运行下面的命令,这将安装 cx_Oracle,然后
sudo easy_install cx_Oracle
- 你可以通过进入 Python 提示符并输入 import cx_Oracle 来检查是否安装成功
要让 cx_Oracle在OS X上运行,需要配置一些东西。重要的步骤有:
首先,创建一个虚拟环境,这个环境里的Python解释器要设置成只支持32位。在虚拟环境的bin目录下(
$WORKON_HOME/*虚拟环境名称*/bin
):% mv python python.fat % lipo python.fat -remove x86_64 -output python
虽然现在的Python环境很简单,但它的配置还比较复杂,所以我们需要通过一个不太常见的环境变量来强制设置,这样distutils才能识别到:
ARCHFLAGS="-arch i386" pip install cx_Oracle
如果你在使用苹果自带的 Python 2.7,它会优先以 64 位模式运行。如果你安装的 Oracle 库只有 32 位版本,这就会造成问题。你可以尝试强制让这个 Python 以 32 位模式运行,方法是这样启动它:
arch -i386 python2.7
如果你总是小心地通过 /usr/bin/python
来启动 Python,你也可以使用苹果的 man
页面上描述的任一方法,比如设置一个叫 VERSIONER_PYTHON_PREFER_32_BIT
的环境变量,或者通过 defaults
设置一个永久的默认值。