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

时间:2010-07-27 23:54:42

标签: python oracle py2exe cx-oracle instantclient

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

如果你想构建多个cx_Oracle版本(例如:cx_Oracle10g,cx_Oracle11g等),那么你需要修改cx_Oracle setup.py脚本。脚本的最后一步是调用setup();第一个参数是要构建的模块的名称。您需要做的就是将"cx_Oracle"更改为"cx_Oracle" + ver,其中ver为10g11g等。要么创建多个脚本并对其进行硬编码,要么添加另一个脚本参数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模块。