【问题标题】:Setting the correct environment variable before calling cx_Oracle on Linux在 Linux 上调用 cx_Oracle 之前设置正确的环境变量
【发布时间】:2017-10-03 17:54:39
【问题描述】:

一些背景

cx_Oracle,用于从Python访问Oracle数据库,需要在加载和使用包之前设置环境变量。在Windows上,需要将文件夹instantclient_12_2添加到PATH中,而在Linux上,需要设置环境变量LD_LIBRARY_PATH,指向instantclient_12_2文件夹,在shell(在运行你的python脚本之前):

export LD_LIBRARY_PATH= path/to/instantclient_12_2/folder:$LD_LIBRARY_PATH

问题

在 Windows 上,如果您从 python 脚本将 instantclient_12_2 文件夹添加到 PATH 中,一切都会按预期进行,您不必强制用户手动更改 PATH:

# On Windows, it works like a charm
import os
os.environ['PATH'] += ';' + 'Z:\\path\\to\\instantclient_12_2\\folder' 
import cx_Oracle
tns = cx_Oracle.makedsn("server", "port", "DSN")
connection = cx_Oracle.connect("user", "password", tns)
cursor = connection.cursor()
cursor.execute("select * from ...")

不幸的是,这不适用于 Linux(我在 Oracle Linux Server 版本 7.3 上运行,即 CentOS)。等效脚本(即从 python 脚本设置 LD_LIBRARY_PATH 变量而不是添加到 PATH)不起作用:

# On Linux, the following code does not work
import os
os.environ['LD_LIBRARY_PATH'] = '/path/to/instantclient_12_2/folder' 
import cx_Oracle
tns = cx_Oracle.makedsn("server", "port", "DSN")
connection = cx_Oracle.connect("user", "password", tns)
cursor = connection.cursor()
cursor.execute("select * from ...")

是否可以在 Linux 上设置环境变量 LD_LIBRARY_PATH 以使 cx_Oracle 能够使用其值来加载和正常工作?如果可能,您如何实现这一目标?

相关问题

关于如何从 Python 设置环境变量的 SOF 问题有很多,但据我所知,没有一个专门处理加载 cx_Oracle 而无需手动处理环境变量的问题。

一些答案​​肯定“无法从子进程更改环境变量”。但是在这种情况下,cx_Oracle 执行的任何代码都在主 python 脚本创建的上下文中执行(即父进程,而不是子进程),那么大概cx_Oracle 应该能够访问在此创建的环境变量上下文(Windows 中实际发生的情况)。

【问题讨论】:

    标签: python linux oracle environment-variables cx-oracle


    【解决方案1】:

    不,您不能在进程内设置 LD_LIBRARY_PATH。 startup 代码会检查此变量,因此一旦应用程序启动,它就会被完全忽略!请注意,这与 Windows 不同。唯一可能的方法是在设置环境变量后重新执行该进程(或执行一个运行您的真实代码的新进程)——但这在大多数情况下不太可能是一个可接受的答案!

    环境变量 LD_LIBRARY_PATH 通常在您的登录脚本中设置,或者通过将文件添加到 /etc/ld.so.conf.d 并运行 ldconfig 来有效地全局设置。如果这些都不可接受,您还可以创建一个简单的 shell 脚本来设置环境变量,然后执行您的 Python 脚本。

    希望能回答您的问题!

    【讨论】:

    • startup 代码检查变量?那么为什么在 Windows 上附加到 PATH 有效呢?机制不一样吗?如果您详细说明此行为背后的原因,我很乐意将您的答案标记为正确。
    • 顺便说一句,我最终得到了一个类似于创建“设置环境变量的简单 shell 脚本”的解决方法,但我只是创建了一个新的 python 脚本 A (start.py i>) 准备环境,然后调用脚本 B (system.py)。
    • Windows进程启动行为和Linux进程启动行为不同,所以进程不一样!
    猜你喜欢
    • 2015-05-15
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2015-02-14
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多