更改当前进程环境的 LD_LIBRARY_PATH

新手上路,请多包涵

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

更具体地说,在 python 脚本中,我想更改 LD_LIBRARY_PATH 以便在导入依赖于某些 xyz.soxyz.so bec31 的模块 ‘x’ 时LD_LIBRARY_PATH 中的给定路径

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

编辑:我想我需要提到我已经尝试过像 os.environ[“LD_LIBRARY_PATH”] = mypath os.putenv(‘LD_LIBRARY_PATH’, mypath)

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

Edit2 ,所以问题是我们可以更改环境或其他内容以便库加载程序看到它并从那里加载吗?

原文由 Anurag Uniyal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

原因

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

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

您确实有一些选择:

A. 如果您知道您将需要 xyz.so 来自 /some/path ,并从一开始就控制 python 脚本的执行,那么只需将 LD_LIBRARY_PATH 设置为 your喜欢(在检查它是否已经如此设置之后),然后自己重新执行。这就是 Java 所做的。

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

C. 如果您自己构建 x.so ,您可以将 -Wl,-rpath=/some/path 添加到它的链接行,然后导入 x.so /some/path 导致加载依赖模块 ---

原文由 Employed Russian 发布,翻译遵循 CC BY-SA 3.0 许可协议

根据 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)

原文由 cristi 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题