最近,由于项目的短信平台对其它浏览器兼容,只支持IE,但是我们移动端自动化需要测试iphone手机,必须要连接MAC系统下,众所周知,MAC对IE的不友好性,故没办法通过短信平台在UI层自动化获取短信验证码,所以,我们决定直接通过访问短信平台的数据库,从而满足短信验证码的自动化获取功能。
        所用的mac系统是MacOS10.12,Python3.4,cx_oracle(6.0rc2)
一 下载安装python3.4
   macOS10.12其实有自带的python2.7,但是由于项目需要所以需要下载升级,所以我选择了python3.4作为工具
   python3.4下载地址:https://www.python.org/downloads/release/python-344/
     
    下载后直接安装即可。
    注意 :有人说,要使用新的python必须要重新连接而且删除自带的python,其实没有必要,只需要在系统环境变量中加入新下载安装的地址就可以,如需要使用python3.4,只需要在终端输入python3即可,千万不要删除,因为删除了会导致系统用到python的东西会有问题,例如xcode会无法使用。
二 下载oracle instant client
其实若需要访问远程的oracle,不需要下载安装客户端,只需要下载instantclient-basic和instantclient-sdk即可,因为我们不需要建立数据库,只是一个访问,千万不要走了冤枉路,具体下载和安装如下:
1⃣️地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
 
这个要根据自己的mac选择,一般mac机选择如上图的连接,进去之后根据要连接的oracle版本选择,现在主流的有10g和11g,我要连接的是11g,所以选择如下:
 
下载完之后,两个文件应该是两个文件夹,第一个instantclient-basic-macos.x64-11.2.0.4.0.zip解压(我的事自动解压)为文件夹-instantclient_11_2,第二个也是一个文件夹instantclient_11_2-2,里面有一个sdk的文件夹。你需要做的就是把sdk的整个文件夹复制粘贴到第一个文件夹也就是 instantclient_11_2里面。
2⃣️ 解压ottclasses.zip(这个压缩包在刚才的sdk文件夹中)经过测试,这一步可以省略,具体也不清楚是干嘛的,有大神清楚请赐教
3⃣️ 修改 /etc/profile,增加系统的环境变量,(在这里,有一个坑,就是mac10.12第三方程序禁止访问系统变量,导致最终在python的idle上运行cx_oracle失败,解决办法见下文)
在终端进入etc,并修改环境变量,具体代码如下,我刚才下载的instantclient_11_2文件夹放到了桌面,所以设置的时候地址为我自己的安放目录,这里要根据自己的安放目录设置,我的文件地址:/Users/zdh/Desktop/instantclient_11_2
cd /etc/
sudo chmod 777 profile
vi profile 
export ORACLE_HOME=/Users/zdh/Desktop/instantclient_11_2
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME
保存并返回后,要执行系统变量使其生效,命令如下
source profile
这里系统变量就生效了,可以用在终端输入命令$ORACLE_HOME,出现自己设置的路径就成功了
(其实mac的环境变量又多种设置方法,这是其中之一,大家可以自行去网上查询,这里不做过多阐述)
4⃣️链接库文件
 进到/Users/zdh/Desktop/instantclient_11_2,也就是你刚才放置的地方,执行如下命令
ln -s libclntsh.dylib.11.1 libclntsh.dylib
ln -s libocci.dylib.11.1 libocci.dylib
文件夹中出现这两个就算成功了,如果误操作,生成错了,要先删除了这两个文件,才能再次链接
 

5⃣️安装cx_oracle,如果有网络并且有pip,那就会容易些,需要执行如下命令
python -m pip install cx_Oracle(这个是安装cx_oracle5.3)
python -m pip install cx_Oracle --pre(这个事安装最新的6.0rc2
以上哪个都可以,若没有网络需要现在线下包安装,地址https://oracle.github.io/python-cx_Oracle/
6⃣️  在终端测试一下,运行下图语句若没有报错证明没有问题
 
 -----------上面的内容全部完成后,在终端运行程序并链接oracle已经没有问题,但是在实际项目中不能只在终端运行,我们的项目需要用python的IDLE来执行,由于macOS 的安全机制,用IDLE执行会出现一些问题,具体问题以及解决方法如下
问题1:ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Library not loaded: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1

Referenced from: /Library/Python/2.7/site-packages/cx_Oracle.so

Reason: image not found 
 
这个问题是由于DYLD_LIBRARY_PATH系统的环境变量没有正确的继承导致,cx_Oracle.so找不到libclntsh.dylib.11.1,我们需要来人肉告诉cx_Oracle.so它想要的文件在哪,命令如下(注意这是一行代码,最后面的是你自己的python安装目录):
install_name_tool -change /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1 $ORACLE_HOME/libclntsh.dylib.11.1 /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/cx_Oracle.so
然后会遇到另一个问题ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Library not loaded: /ade/dosulliv_ldapmac/oracle/ldap/lib/libnnz11.dylib

Referenced from: /usr/local/lib/share/oracle/installclient_11_2/libclntsh.dylib.11.1

Reason: image not found
道理和上面的是一样的,命令如下:
可能在此之前需要赋予修改libclntsh.dylib.11.1的权限
chmod 777 $ORACLE_HOME/libclntsh.dylib.11.1
install_name_tool -change /ade/dosulliv_ldapmac/oracle/ldap/lib/libnnz11.dylib $ORACLE_HOME/libnnz11.dylib $ORACLE_HOME/libclntsh.dylib.11.1
问题2:cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle
这个问题是有macos系统的sip安全机制导致 ,需要关闭sip,方法是:

  • 关机-开机-按住CMD+R-等待进入恢复模式
  • 工具-终端-执行如下命令
  • csrutil disable

然后重新启动系统,则设置成功,当然开启sip,方法一样,命令为csrutil enable 
问题3:上面的东西都设置完成之后,依然会报错的那就是极品问题了,不幸的是我真遇到了!!,忙活了半天,除了一身汗,终于解决了,具体的问题就是,终端运行完全没问题,但是一到python的IDLE就会报错,偶然机会我试着用IDLE获取了一下系统变量,发现竟然获取不到 之前设置的环境变量ORACLE_HOME,LD_LIBRARY_PATH和DYLD_LIBRARY_PATH,那问题就找到了,又是mac的安全机制啊,限制了第三方工具获取系统的变量,那解决办法就是我们需要手动去添加了,添加方法如下:
 1  cd /Applications/Python\ 3.4/IDLE.app/Contents/Resources/(这个是系统安装的程序配置文件,进入此文件夹修改即可)
2 sudo nano idlemain.py(必须要用管理员权限,不然此文件无法修改)
3    在os.chdir(os.path.expanduser('~/Documents')) 这一行下面添加如下代码

        os.environ["ORACLE_HOME"]="/Users/zdh/Desktop/instantclient_11_2"
        os.environ["DYLD_LIBRARY_PATH"]="/Users/zdh/Desktop/instantclient_11_2"

        os.environ["LD_LIBRARY_PATH"]="/Users/zdh/Desktop/instantclient_11_2" 
4    保存更改, ctrl+x->Y->回车,退出idlemain.py的编辑状态
即我们去手动给他配置上环境变量,具体的路径请查看自己的安放目录。
做完上面的工作,用python的IDLE应该也不会报错了
最后,还有一个问题就是在python获取的sql结果会出现乱码问题,同样,这也需要给环境变量设置字符集,我们的oracle11g所用的字符集是gbk中文字符,所以同样需要设置 
idlemain.py文件。在同样的位置,添加如下代码
os.environ['NLS_LANG'] = 'American_America.ZHS16GBK' 
终于完成了,是不是一身汗?
如有问题,可以咨询我,qq与空间同号。最后,给大家贴一些参考网址,祝君顺利~
http://www.jianshu.com/p/1f584f1e7546
http://blog.csdn.net/ys_zhang/article/details/71393711
http://blog.csdn.net/lymm000/article/details/68925683
http://blog.csdn.net/q1241580040/article/details/48747569  

Mac10.12下Python3.4调用oracle的更多相关文章

  1. java下实现调用oracle的存储过程和函数

    在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...

  2. oracle学习笔记1:windows下oracle数据库安装及.net调用oracle数据库

    1.下载32位或64位oracle数据库并且安装,安装时可以选择安装数据库实例或者不安装,如果不安装的话之后可以用Database Configuration Assistant(DBCA) 通过向导 ...

  3. linux下python3调用c代码或者python3调用c++代码

    前几篇的blog都是为了这个实验做基础,先说 原因是python调用数据库150w条数据22s,然后处理数据,其实就2个简单的for循环,65s 需求: 1. python调用c++函数 2. c++ ...

  4. 【学习】java下实现调用oracle的存储过程和函数

    在oracle下创建一个test的账户,然后按一下步骤执行: 1.创建表:STOCK_PRICES --创建表格CREATETABLE STOCK_PRICES( RIC VARCHAR(6) PRI ...

  5. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA

     环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterpris ...

  6. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机HA

    环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterprise ...

  7. mac10.9下eclipse的storm开发环境搭建

    --------------------------------------- 博文作者:迦壹 博客地址:http://idoall.org/home.php?mod=space&uid=1& ...

  8. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  9. python3.5连接oracle数据及数据查询

    今天心血来潮研究下用python连接oracle数据库,看了一下demo,本以为很简单,从操作到成功还是有点坎坷,这里分享给大家,希望为后面学习的童鞋铺路. 一.首先按照cx_Oracle 二:在py ...

随机推荐

  1. 粮草先行——Android折叠屏开发技术点(二)

    继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...

  2. 在已有的Asp.net MVC项目中引入Taurus.MVC

    Taurus.MVC是一个优秀的框架,如果要应用到已有的Asp.net MVC项目中,需要修改一下. 1.前提约定: 走Taurus.MVC必须指定后缀.如.api 2.原项目修改如下: web.co ...

  3. ASP.NET Razor

    一.为什么要学习Razor? 可以让服务器代码(就是c#和vb)嵌入到网页中,也就是说这个页面中包含html代码和C#(vb)代码.基于服务器的代码可以在网页传送给浏览器时,创建动态 Web 内容.当 ...

  4. Web前端-Vue.js必备框架(五)

    Web前端-Vue.js必备框架(五) 页面组件,商品列表组件,详情组件,购物车清单组件,结算页组件,订单详情组件,订单列表组件. vue-router 路由 vuex 组件集中管理 webpack ...

  5. MySQL 多实例的安装

    Step 1 . 准备工作 关闭防火墙; 安装 MySQL依赖于libaio 库:下载,解压,重命名 MySQL的执行文件:新建用户组和用户 等准备工作在此不再赘述. 可执行文件目录为 /data/m ...

  6. 今年开搞了,搭建一下vue开发环境

    首先-->搞了几天的SpringBoot玩的差不多了,领导直接说, 别项目组需要做前后端分离,说前端缺少人手,没有办法咯,只能硬着头皮去了, 说先学一下'vue',给我个文档让我学学,说是前半年 ...

  7. 详解docker实战之搭建私有镜像仓库 - kurbernetes

    1.实战目的 搭建企业私有的镜像仓库,满足从开发环境推送和拉取镜像.当我们使用k8s来编排和调度容器时,操作的基本单位是镜像,所以需要从仓库去拉取镜像到当前的工作节点.本来使用公共的docker hu ...

  8. 教你如何把openfire的muc聊天室改造为群

    openfire群聊与QQ群对比 应该是去年的时候开始接触openfire,当时在分析后发现基于xmpp协议的openfire已经具备了群聊的功能.也就没太当回事,觉得加点功能就可以做成类似于QQ群的 ...

  9. 怎么用Mac电脑创建多个桌面

    区别于win的单个桌面,Mac电脑可以设置多个桌面,方面用户处理各种多乱杂的情况.究竟怎么用Mac电脑创建多个桌面呢?一起来看看吧! 1.首先打开Mission Control,点击偏好设置 2.然后 ...

  10. Selenium的发展历史及原理

    目录 1. selenium1.0的产生 2. webdriver的产生 3. selenium和webdriver的合并 4. selenium3.0的产生 1. selenium1.0的产生 为什 ...