在不同版本的Oracle客户端上部署cx_Oracle

2 投票
1 回答
3761 浏览
提问于 2025-04-16 01:56

我有一些小的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 个回答

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 模块。

撰写回答