更改当前进程环境的LD_LIBRARY_PATH

时间:2009-07-24 14:33:07

标签: python shared-libraries environment-variables

是否可以更改当前流程的环境变量?

更具体地说,在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 ,所以问题是我们可以更改环境或其他东西,以便库加载器看到它并从那里加载吗?

4 个答案:

答案 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"