这篇文章的起因是,在公司的服务器上没有root权限,但是需要使用 Python 访问 Oracle,而不管是使用 pip 安装组件还是安装 Oracle 的 client,都需要相应权限。本文即解决该问题。
使用 virtualenv
使用系统自带 Python 和 pip
安装组件时,默认会安装到系统目录下,需要 root 权限才能执行写操作。
不管是从资源隔离的角度,还是从绕过 root 的角度,你都需要一套顺手的 Python 虚拟环境工具:virtualenv
。
去求运维哥哥帮忙安装 virtualenv
吧。顺便说一句,pip
和 virtualenv
在 Debian 下都可以直接使用 apt-get
安装,对应的包分别是 python-pip
和 virtualevn
。如果服务器上没有的话,大胆地提供单吧。
关于 virtualenv
,本文不再赘述,如有疑问,请移步我的另一篇文章《聊聊 virtualenv 和 virtualenvwrapper 实践》。
有了 virtualenv
,就可以建立自己的 Python 虚拟环境了,在虚拟环境中不需要任何 root 权限。之后的工作都是在虚拟中进行的。
安装 cx_Oracle
Python 中访问 Oracle 需要使用 cx_Oracle
,此处直接使用 pip
安装即可。
pip install cx_Oracle --pre
我碰到了一个安装过程中提示找不到 Python.h
文件的,这说明系统中缺少 python-dev
包,是用 apt-get
装的,同样请运维帮装上就行了。
安装 instantclient
只是安装完 cx_Oracle,在 import 的时候会报找不到库。还要再安装一下 Oracle 官方的 instantclient。下载地址在这里,下载Instant Client Package - Basic
即可。
下载之后,进入某个有权限的目录,假如是用户的根目录 ~
。将下载到的 zip 包解压,例如到 ~/oracle/instantclient_12_2/
目录下。之后,需要添加环境变量让系统能够找到这些库。在终端的 rc 文件里,例如 ~/.bashrc
末尾,添加环境变量如下。
export ORACLE_HOME=$HOME/oracle/instantclient_12_2
export LD_LIBRATY_PATH=$ORACLE_HOME:$LD_LIBRATY_PATH
export PATH=$ORACLE_HOME:$PATH
此时,还需要额外做一件事情,就是建立 libclntsh.so
的软链接。
ln -s libclntsh.so.12.1 libclntsh.so
做这件事情的原因是,cx_Oracle
需要使用库文件 libclntsh.so
,但是在解压之后的 instantclient
中只包含带有版本号的该库文件,因此我们需要人工做一个软链接,以供识别。
接下来,让刚修改了环境变量的 rc 文件生效即可。
source ~/.bashrc
需要注意的是,在这次 source
之后,之前进入的虚拟环境将被退出。如果后面还需要继续八戒影院在虚拟环境里工作的话,需要再进入一次。
尾声
现在,理论上应该可以在 Python 里www.rcsx.org正常 import cx_Oracle
了。如果可以的话,说明以及可以使用了。
如果不行的话,需要补充一些报错中提到的包。我在测试过程中发现系统中缺少 libaio1
和 libaio-dev
两个包。一并请运维装上就好了。
Enjoy your work ~