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

Sau*_*rdo 1 python linux oracle cx-oracle environment-variables

一些上下文

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
Run Code Online (Sandbox Code Playgroud)

问题

在 Windows 上,如果您将instantclient_12_2文件夹从 python 脚本添加到 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 ...")
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于 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 ...")
Run Code Online (Sandbox Code Playgroud)

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

相关问题

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

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

Ant*_*nga 5

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

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

希望能回答你的问题!