ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

python – 将cx_Oracle部署到各种版本的Oracle Client上

2019-10-09 02:05:50  阅读:569  来源: 互联网

标签:py2exe python oracle cx-oracle instantclient


我有一些使用cx_Oracle连接到Oracle数据库的小型python应用程序.我通过使用py2exe编译它们来部署这些应用程序,这在许多情况下都可以正常工作.

问题是,在许多需要安装它的人中没有标准的Oracle客户端版本(例如9i和10g),尝试让每个人都在单个Oracle客户端版本上进行标准化会非常令人沮丧.我目前正在使用带有cx_Oracle 4.4.1 for 9.2i的9.2客户端,所以当我py2exe时,生成的exe包含cx_Oracle 4.4.1库,不适用于10g客户端.

我没有使用任何Oracle版本的任何特定功能,因此除了cx_Oracle兼容性问题之外,我没有理由关心正在使用的客户端版本.

理想的解决方案是以某种方式编译一个完全独立于机器上安装的Oracle客户端的版本.

如果那是不可能的,我愿意为每个主要的Oracle版本(my_app_9i.exe,my_app_10g.exe等)编译单独的exes,但是我无法想出一个简单的方法甚至这样做,因为安装新的cx_Oracle会覆盖我的旧版本,每当我做出改变时,我都要不断地来回交换库来编译其他版本.

欢迎任何建议或其他选择.

解决方法:

如果你想构建多个cx_Oracle版本(例如:cx_Oracle10g,cx_Oracle11g等),那么你需要修改cx_Oracle setup.py脚本.脚本的最后一步是调用setup();第一个参数是要构建的模块的名称.您需要做的就是将“cx_Oracle”更改为“cx_Oracle”ver,其中ver为10g,11g等.创建多个脚本并对其进行硬编码,或者向setup.py添加另一个参数以动态选择它.

当然,一旦你有了这个,你需要一种机制来在运行时加载正确的模块.为此,您需要创建自己的cx_Oracle模块,其中包含__init__.py文件,如下所示:

try:
  from cx_Oracle9g import *
except ImportError:
  try:
    from cx_Oracle10g import *
  except ImportError:
    try:
      from cx_Oracle11g import *

您需要做的就是将您的自定义cx_Oracle模块以及正确的cx_OracleXg模块与您的应用程序一起发送.

或者,您可以让自定义cx_Oracle模块动态检查每个可用的Oracle客户端库(9g,10g,11g等),然后只导入正确匹配的cx_OracleXg模块.在这种情况下,您只需要发送一个二进制文件,其中包含您的自定义cx_Oracle模块以及所有cx_OracleXg模块.

标签:py2exe,python,oracle,cx-oracle,instantclient
来源: https://codeday.me/bug/20191009/1876012.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有