gpt4 book ai didi

python - 在 Linux 上调用 cx_Oracle 之前设置正确的环境变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:41 27 4
gpt4 key购买 nike

一些上下文

用于从 Python 访问 Oracle 数据库的包 cx_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 将能够使用其值来加载和正常工作?如果可能,您如何实现这一目标?

相关问题

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

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

最佳答案

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

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

希望这能回答您的问题!

关于python - 在 Linux 上调用 cx_Oracle 之前设置正确的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46550598/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com