在不同版本的Oracle客户端上部署cx_Oracle
我有一些小的Python应用程序,它们使用cx_Oracle来连接Oracle数据库。我通过py2exe来打包这些应用,通常这样做效果不错。
问题是,不同的人安装的Oracle客户端版本(比如9i和10g)并不统一,想让大家都用同一个版本真是太麻烦了。目前我在用9.2的客户端和cx_Oracle 4.4.1来支持9i,所以当我用py2exe打包后,生成的exe文件里包含了cx_Oracle 4.4.1库,这样就不能和10g的客户端一起使用了。
我并不使用Oracle版本中的任何特定功能,所以其实我并不在乎使用哪个客户端版本,唯一需要注意的就是cx_Oracle的兼容性问题。
理想的解决方案是能编译出一个完全不依赖于机器上安装的Oracle客户端的版本。
如果这不可能,我愿意为每个主要的Oracle版本编译不同的exe文件(比如my_app_9i.exe、my_app_10g.exe等),但我找不到简单的方法来做到这一点,因为安装新的cx_Oracle会覆盖掉我旧的版本,每次我想编译其他版本时都得来回切换库,这样实在太麻烦了。
欢迎任何建议或其他选项。
1 个回答
如果你想要构建多个版本的 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
模块。