Python与Oracle
我想通过Python连接到安装在另一台机器上的Oracle 10.1.0.2.0数据库。
我的电脑运行的是Ubuntu 9.04 Jaunty,安装了Python 2.6。
我下载并解压了 instantclient-basic-linux32-10.1.0.5-20060511.zip
,然后设置了 LD_LIBRARY_PATH
和 ORACLE_HOME
,让它们指向我解压的目录。接着,我下载了 cx_Oracle-5.0.2-10g-py26-1.i386.rpm
并安装了它:
$sudo alien -i cx_Oracle-5.0.2-10g-py26-1.i386.rpm
当我运行
$python -c 'import cx_Oracle'
时,我得到了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /usr/lib/python2.6/cx_Oracle.so: undefined symbol: OCIClientVersion
如果有人能帮忙,我会非常感激。
2 个回答
感谢bobince的回答,我来简单总结一下可能的解决方案,让大家更容易理解。
首先,LD_LIBRARY_PATH
和ORACLE_HOME
这两个变量需要指向你解压Oracle InstantClient的文件夹。
- 你可以使用
cx_Oracle 4.4.1 for Oracle 9i
,配合Oracle InstantClient 10.1
。
安装完cx_Oracle 4.4.1后,
sudo alien -i cx_Oracle-4.4.1-9i-py26-1.i386.rpm
cx_Oracle.so这个文件会放在/usr/local/lib/python2.6/site-packages目录下,所以你需要创建一个符号链接。
sudo ln -s /usr/local/lib/python2.6/site-packages/cx_Oracle.so /usr/lib/python2.6
另外,因为你使用的是cx_Oracle for Oracle 9i,所以还需要在InstantClient目录下创建一个符号链接。
sudo ln -s libclntsh.so.10.1 libclntsh.so.9.0
- 另外,你也可以选择使用
cx_Oracle 5.0.2 for Oracle 10g
,搭配Oracle InstantClient 10.2
。
安装步骤是类似的。
sudo alien -i cx_Oracle-5.0.2-10g-py26-1.i386.rpm
sudo ln -s /usr/lib/python2.6/site-packages/cx_Oracle.so /usr/lib/python2.6
- 注意:将cx_Oracle 10g的源代码构建为与Oracle InstantClient 10.1兼容是不行的,因为cx_Oracle 10g使用的是Oracle 10g Release 2特定的代码。
最后要注意的是,无法保证这些解决方案没有问题(还需要进一步测试)。
我觉得OCIClientVersion需要的是Oracle 10g的第二个版本,但你现在用的是第一个版本。
看起来你下载的cx_Oracle这个程序是用-DORACLE_10GR2这个选项编译的,这就意味着它包含了OCIClientVersion这个调用。因为这个选项是在编译的时候才会用到,所以应该有10g和10gR2的不同下载版本,但似乎并没有提供:
This module has been built with Oracle 9.2.0, 10.2.0, 11.1.0 on Linux
所以你可能需要下载cx_Oracle的源代码,然后自己编译一下。(这样的话,你还需要Python和Oracle客户端的头文件。)
另外,你也可以试试Oracle 9i版本的cx_Oracle。这听起来有点不靠谱,但据说是可以工作的。