当前位置: 首页 > news >正文

Debian下无root权限使用Python访问Oracle

Debian 下无 root 权限使用 Python 访问 Oracle

这篇文章的起因是,在公司的服务器上没有root权限,但是需要使用 Python 访问 Oracle,而不管是使用 pip 安装组件还是安装 Oracle 的 client,都需要相应权限。本文即解决该问题。

使用 virtualenv

使用系统自带 Python 和 pip 安装组件时,默认会安装到系统目录下,需要 root 权限才能执行写操作。

不管是从资源隔离的角度,还是从绕过 root 的角度,你都需要一套顺手的 Python 虚拟环境工具:virtualenv

去求运维哥哥帮忙安装 virtualenv 吧。顺便说一句,pipvirtualenv 在 Debian 下都可以直接使用 apt-get 安装,对应的包分别是 python-pipvirtualevn。如果服务器上没有的话,大胆地提供单吧。

关于 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 里正常 import cx_Oracle 了。如果可以的话,说明以及可以使用了。

如果不行的话,需要补充一些报错中提到的包。我在测试过程中发现系统中缺少 libaio1libaio-dev 两个包。一并请运维装上就好了。

Enjoy your work ~

相关文章:

  • bzoj 1860: [Zjoi2006]Mahjong麻将 题解
  • git使用点滴:如何查看commit的内容和git 获取最近一次提交的commit id
  • 美光Sun合作长寿命SLC闪存 100万次写入
  • OCZ新Summit系列固态硬盘强悍性能曝光
  • 用MAID 2.0降低存储费用
  • 为什么要创建开放源码的PlayScala社区?
  • 关于 TCP/IP,必知必会的十个问题
  • OSStatus code 查询
  • TCP协议中FLAG的含义
  • TypeScript学习笔记(六):泛型
  • Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关
  • Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
  • java中你确定用对单例了吗?
  • 深入分析Sleep(0)与Sleep(1)的区别
  • swift3.0常用操作包含删除字符串(string),更换字符串,插入字符串
  • php的引用
  • 30秒的PHP代码片段(1)数组 - Array
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • C++入门教程(10):for 语句
  • Cookie 在前端中的实践
  • javascript 哈希表
  • Laravel5.4 Queues队列学习
  • Quartz初级教程
  • Ruby 2.x 源代码分析:扩展 概述
  • vue-router的history模式发布配置
  • Vue官网教程学习过程中值得记录的一些事情
  • 程序员最讨厌的9句话,你可有补充?
  • 分享几个不错的工具
  • 回顾2016
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 强力优化Rancher k8s中国区的使用体验
  • 人脸识别最新开发经验demo
  • 三分钟教你同步 Visual Studio Code 设置
  • 深入浏览器事件循环的本质
  • 思否第一天
  • 微信开源mars源码分析1—上层samples分析
  • 系统认识JavaScript正则表达式
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 应用生命周期终极 DevOps 工具包
  • 运行时添加log4j2的appender
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $.ajax()参数及用法
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net6使用Sejil可视化日志
  • .Net6使用WebSocket与前端进行通信
  • @RequestMapping处理请求异常
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @Transactional 竟也能解决分布式事务?
  • @拔赤:Web前端开发十日谈