我有一些使用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会覆盖我的旧版本,每当我进行更改时,我都要不断地来回交换库来编译其他版本。
欢迎任何建议或其他选择。
答案 0 :(得分:3)
如果你想构建多个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
模块。