是否可以更改当前进程的环境变量?
更具体地说,在 python 脚本中,我想更改 LD_LIBRARY_PATH
以便在导入依赖于某些 xyz.so
, xyz.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 许可协议
原因
不起作用很简单:此环境变量控制动态加载程序的行为(
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
导致加载依赖模块---
。