数据库
首页 > 数据库> > python – 将cx_Oracle部署到各种版本的Oracle Client上

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

作者:互联网

我有一些使用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