关于python:更改当前进程环境的LD_LIBRARY_PATH

Change current process environment's LD_LIBRARY_PATH

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

更具体地说,在python脚本中,我想更改LD_LIBRARY_PATH,以便在导入依赖于某个xyz.so的模块"x"时,xyz.so从ld_library_path中的给定路径获取。

有没有其他方法可以动态地更改从中加载库的路径?

编辑:我想我应该说我已经试过了os.environ["ld_library_path"]=我的路径os.putenv('ld_library_path',mypath)

但是这些改变了环境。对于生成的子进程,而不是当前进程,模块加载不考虑新的ld_库路径

edit2,所以问题是我们能改变环境或者其他什么东西吗,这样库加载程序就可以看到它并从那里加载?


原因

1
os.environ["LD_LIBRARY_PATH"] = ...

不起作用很简单:这个环境变量控制动态加载器(Linux上的ld-linux.so.2,Solaris上的ld.so.1)的行为,但加载器在进程启动时只查看一次LD_LIBRARY_PATH。在当前过程中更改LD_LIBRARY_PATH的值在该点之后没有任何效果(正如这个问题的答案所说)。

您有一些选择:

A.如果你知道你需要来自/some/pathxyz.so,并且从一开始就控制python脚本的执行,那么只需将LD_LIBRARY_PATH设置为你喜欢的(在确认它还没有设置之后),然后重新执行自己。这就是Java所做的。

b.在导入x.so之前,可以通过其绝对路径导入/some/path/xyz.so。然后导入x.so时,加载程序将发现它已经加载了xyz.so,并将使用已加载的模块而不是再次搜索它。

c.如果您自己构建x.so,可以将-Wl,-rpath=/some/path添加到它的链接线上,然后导入x.so将导致加载程序在/some/path中查找依赖模块。


根据俄罗斯人的回答,这对我来说很有用

1
2
3
4
5
6
7
8
9
10
11
12
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)


根据我的经验,尝试改变加载程序对运行中的Python的工作方式是非常棘手的;可能与操作系统/版本有关;可能不起作用。在某些情况下,解决这一问题的一个方法可能会有所帮助,那就是使用shell脚本启动更改环境参数的子流程,然后使用shell启动一个新的python。


嗯,环境变量存储在字典os.environ中,所以如果您想更改,可以这样做

1
os.environ["PATH"] ="/usr/bin"