cx_Oracle 具有多个 Oracle 客户端版本

cx_Oracle with multiple Oracle client versions

我正在 运行ning Python 2.7 并且正在 linux 64 位 OS 上使用 cx_Oracle。我需要能够 运行 针对 11.2 或 12.1 Oracle 客户端,因为我无法确定哪个客户端将安装在已部署的目标上。我知道针对每个 Oracle 客户端构建了 cx_Oracle。我如何确定该应用程序可以正常工作?我应该提到我正在使用 pyinstaller 来打包应用程序。是否有针对两个 Oracle 客户端构建的 cx_Oracle 版本,或者我是否需要我的应用程序的两个不同版本...一个用于 11g,一个用于 12c 客户端?

虽然理论上您应该能够构建 cx_Oracle 的 Oracle 11g 版本并将其与 Oracle 11g 和 Oracle 12c 客户端一起使用,但我不推荐它。如果您能够说服您的用户使用 Oracle 12c 即时客户端,那将是最简单的。该客户端能够毫无困难地访问 11g 和 12c 数据库。但如果那不可能,另一个选项如下:

1) 为 11g 和 12c 编译 cx_Oracle 并将两个副本放入名为(例如)cx_Oracle_11g.so 和 cx_Oracle_12c.so.

的安装中

2) 使用如下代码动态导入 cx_Oracle:

for version in ("11g", "12c"):
    fileName = os.path.join(installDir, "cx_Oracle_%s.so" % version)
    try:
        module = imp.load_dynamic("cx_Oracle", fileName)
        break
    except ImportError:
        pass

3) 像以前一样在任何需要的地方使用动态导入的模块。由于动态加载的模块被命名为 cx_Oracle,您应该能够以常规方式在其他代码中导入它,它会找到您动态加载的模块。

4) 使用cx_Oracle 6.x,它同时支持任何Oracle Client 11.2、12.1 和12.2。