是否可以更改当前流程的环境变量?
更具体地说,在python脚本中,我想更改LD_LIBRARY_PATH
,以便在导入依赖于某些xyz.so
的模块“x”时,xyz.so
取自我的给定路径LD_LIBRARY_PATH
有没有其他方法可以动态更改加载库的路径?
编辑:我想我需要提一下,我已经尝试了类似的东西 os.environ [“LD_LIBRARY_PATH”] = mypath os.putenv('LD_LIBRARY_PATH',mypath)
但这些修改了env。对于生成的子进程,而不是当前进程,并且模块加载不考虑新的LD_LIBRARY_PATH
Edit2 ,所以问题是我们可以更改环境或其他东西,以便库加载器看到它并从那里加载吗?
答案 0 :(得分:33)
原因
os.environ["LD_LIBRARY_PATH"] = ...
不起作用很简单:这个环境变量控制动态加载器的行为(Linux上的ld-linux.so.2
,Solaris上的ld.so.1
),但加载器只在LD_LIBRARY_PATH
处查看一次流程启动。在该点之后更改当前进程中LD_LIBRARY_PATH
的值无效(正如this问题的答案所示)。
你有一些选择:
一个。如果您知道从xyz.so
开始需要/some/path
,并从头开始控制python脚本的执行,那么只需根据自己的喜好设置LD_LIBRARY_PATH
(在检查它不是之后)已经如此设置),并重新执行自己。这就是Java
的作用。
B中。您可以在导入/some/path/xyz.so
之前通过其绝对路径导入x.so
。然后,当您导入x.so
时,加载程序将发现它已加载xyz.so
,并将使用已加载的模块而不是再次搜索它。
℃。如果您自己构建x.so
,则可以将-Wl,-rpath=/some/path
添加到其链接行,然后导入x.so
将导致加载程序在/some/path
中查找依赖模块。
答案 1 :(得分:11)
根据Employed Russian的回答,这对我有用
oracle_libs = os.environ['ORACLE_HOME']+"/lib/"
rerun = True
if not 'LD_LIBRARY_PATH' in os.environ:
os.environ['LD_LIBRARY_PATH'] = ":"+oracle_libs
elif not oracle_libs in os.environ.get('LD_LIBRARY_PATH'):
os.environ['LD_LIBRARY_PATH'] += ":"+oracle_libs
else:
rerun = False
if rerun:
os.execve(os.path.realpath(__file__), sys.argv, os.environ)
答案 2 :(得分:0)
根据我的经验,尝试更改加载程序为正在运行的Python工作的方式非常棘手;可能是OS /版本依赖;可能行不通。在某些情况下可能有用的一种解决方法是启动一个子进程,使用shell脚本更改环境参数,然后使用shell启动新的Python。
答案 3 :(得分:-5)
好吧,环境变量存储在字典os.environ中,所以如果你想改变,你可以做到
os.environ["PATH"] = "/usr/bin"