【发布时间】: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