为什么 pyinstaller 生成的 cx_oracle 应用程序可以在新的 CentOS 机器上运行,但不能在安装了 Oracle 客户端的机器上运行?

Why does pyinstaller generated cx_oracle application work on fresh CentOS machine but not on one with Oracle client installed?

我写了一个 python 应用程序,它使用 cx_Oracle 然后生成一个 pyinstaller 包(folder/single 可执行文件)。我应该注意到它是 64 位 linux。我有一个包含 Oracle 客户端库的自定义规范文件,因此所需的一切都在包中。

当我在新安装的 CentOS 7.1 VM(未安装 Oracle 软件)上 运行 捆绑可执行文件时,程序成功连接到数据库并且 运行s 没有错误。但是,当我在另一个包含 RHEL 7.2 的系统上安装捆绑的可执行文件时,我尝试 运行 它,我得到

Unable to acquire Oracle environment handle.

我的理解是,这是由于 Oracle 客户端安装存在某种冲突。我尝试在机器上取消设置 ORACLE_HOME 给我错误。就好像程序正在寻找 Oracle 客户端库,而不是在我捆绑客户端文件的位置。

它似乎应该适用于两台机器或两台机器。我想我不清楚 Python application/cx_Oracle 如何找到 Oracle 客户端库。同样,它似乎发现它们在安装了全新操作系统的机器上运行良好。关于为什么会发生这种情况的任何想法?

您可能 运行 感兴趣的一件事是,如果您在构建 cx_Oracle 时使用即时客户端 RPM,则 RPATH 将被刻录到共享库中。您可以检查其内容并使用 chrpath 命令更改它。可以在修改后的RPATH中使用特殊路径$ORIGIN指定共享库的相对路径

如果 RPATH 不是罪魁祸首,那么您将需要检查 ldd 命令的输出并查看它正在寻找的位置,然后进行调整以使其自行运行!