如何使用 pyinstaller 构建 cx_oracle 应用程序以使用多个 Oracle 客户端版本?

How do I build a cx_oracle app using pyinstaller to use multiple Oracle client versions?

我正在 Python 中构建应用程序,使用 cx_Oracle (v5) 和 Pyinstaller 来打包和分发应用程序。当我构建和打包应用程序时,我安装了 Oracle 12c 客户端。但是,当我将它部署到安装了 11g 客户端的机器上时,它似乎不起作用。我收到消息 "Unable to acquire Oracle environment handle"。我认为这是因为应用程序使用 Pyinstaller 打包,而我的 ORACLE_HOME 指向 12c 客户端。我知道我拥有的 cx_Oracle 是针对 11g 和 12 库构建的。所以,我想知道如何使用 Pyinstaller 部署应用程序,以便它可以 运行 安装 11 或 12c 客户端库?

顺便说一句,我正在 Linux (debian/Mint 17.2) 上构建它,并部署到 Linux (CentOS 7)。

错误"Unable to acquire Oracle environment handle"表示您的Oracle配置有问题。检查您正在使用的 libclntsh.so 文件。最简单的方法是在 PyInstaller 与可执行文件捆绑在一起的 cx_Oracle 模块上使用 ldd 命令。然后查看是否因为设置环境变量ORACLE_HOME为不同的客户端导致冲突!

如果 PyInstaller 在打包过程中选择了 libclntsh.so 文件,您将需要告诉它停止这样做。目标机器上必须有一个 Oracle 客户端(完整客户端或更简单的即时客户端),而不仅仅是一个文件 (libclntsh.so)。

您还可以通过使用目标计算机上的 cx_Oracle.so 模块建立连接来验证您的配置是否正确——独立于您的应用程序。如果这不起作用或者由于某种原因您没有安装 Python,您也可以使用 SQL*Plus 来验证您的配置是否正常。