我有一些使用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客户端的版本。
如果这不可能,我愿意为每个主要的甲骨文版本(my_app_9i.exe,my_app_10g.exe等)编译单独的cx_Oracle,但我想不出一个简单的方法来做到这一点,因为安装一个新的exe会覆盖我的旧版本,每当我进行更改时,我就必须不断地交换这个库来编译其他版本。
欢迎任何建议或其他选择。
发布于 2010-09-02 06:01:03
如果您想构建多个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模块。
https://stackoverflow.com/questions/3348894
复制相似问题