将cx_Oracle部署到各种版本的Oracle客户端

问题描述:

我有一些使用cx_Oracle连接到Oracle数据库的小型python应用程序。我通过用py2exe编译这些应用程序来部署这些应用程序,在很多情况下它工作正常。将cx_Oracle部署到各种版本的Oracle客户端

问题是,在许多需要安装此软件的人中没有标准的Oracle Client版本(例如9i和10g),并且尝试让每个人都在单个Oracle客户端上实现标准化将会非常令人沮丧版。我现在使用9.2客户端和cx_Oracle 4.4.1 for 9i,所以当我py2exe生成的exe包含cx_Oracle 4.4.1库并且不能与10g客户端一起工作。

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

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

如果这是不可能的,我会愿意为每个主要的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,其中版本号为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模块。

+0

谢谢你的优雅和面向未来的解决方案,抱歉花了我很长的时间来接受它。 – cecilkorik 2010-11-19 04:54:54