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

Python 在Linux上调用cx_Oracle之前设置正确的环境变量,python,linux,oracle,environment-variables,cx-oracle,Python,Linux,Oracle,Environment Variables,Cx Oracle,某些上下文 用于从Python访问Oracle数据库的软件包cx\u Oracle,需要在加载和使用该软件包之前设置环境变量。在Windows上,需要将文件夹instantclient_12_2添加到路径中,而在Linux上,需要设置环境变量LD_LIBRARY_PATH,指向instantclient_12_2文件夹,在shell中运行以下命令(在运行python脚本之前)可以完成以下任务: 问题 在Windows上,如果从python脚本将instantclient_12_2文件夹添加到PA

某些上下文

用于从Python访问Oracle数据库的软件包
cx\u Oracle
,需要在加载和使用该软件包之前设置环境变量。在Windows上,需要将文件夹
instantclient_12_2
添加到路径中,而在Linux上,需要设置环境变量
LD_LIBRARY_PATH
,指向
instantclient_12_2
文件夹,在shell中运行以下命令(在运行python脚本之前)可以完成以下任务:

问题

在Windows上,如果从python脚本将
instantclient_12_2
文件夹添加到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变量,而不是添加到路径)不起作用:

# 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\u LIBRARY\u PATH
,以便
cx\u Oracle
能够使用其值来加载并正常工作?如果可能的话,你如何做到这一点

相关问题

关于如何从Python设置环境变量,有很多问题,但据我所知,没有一个问题专门解决加载
cx\u Oracle
而不需要手动处理环境变量的问题


一些回答肯定了“没有办法从子进程更改环境变量”。但是在这种情况下,
cx\U Oracle
执行的任何代码都是在主python脚本创建的上下文中执行的(即父进程,而不是子进程),那么想必
cx\U Oracle
应该能够访问在此上下文中创建的环境变量(在Windows中实际发生的情况)。

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

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


希望这能回答你的问题

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

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


希望这能回答你的问题

启动代码检查变量?那么为什么在Windows上附加到路径会起作用呢?机制不一样吗?如果您详细说明这种行为背后的原因,我很乐意将您的答案标记为正确。顺便说一句,我最终找到了一种类似于创建“设置环境变量的简单shell脚本”的解决方法,但我只是创建了一个新的python脚本a(start.py),它准备环境,然后调用脚本B(system.py).Windows进程启动行为不同于Linux进程启动行为,因此进程不一样!变量由启动代码检查?那么为什么要在Windows上附加路径?机制不一样吗?如果您详细说明此行为背后的原因,我很高兴将您的回答标记为正确。顺便说一句,我最终的解决方法类似于创建“设置环境变量的简单shell脚本”,但我只是创建了一个新的python脚本a(start.py),它准备环境,然后调用脚本B(system.py).Windows进程启动行为与Linux进程启动行为不同,因此进程不一样!
# 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 ...")