是否可以更改当前进程的环境变量?
更具体地说,在 python 脚本中,我想更改 LD_LIBRARY_PATH
以便在导入依赖于某些 xyz.so
、xyz 的模块“x”时.so
取 self 在 LD_LIBRARY_PATH 中的给定路径
还有其他方法可以动态更改加载库的路径吗?
编辑:我想我需要提到我已经尝试过类似的东西 os.environ["LD_LIBRARY_PATH"] = mypath os.putenv('LD_LIBRARY_PATH', mypath)
但是这些修改了环境。对于生成的子进程,而不是当前进程,并且模块加载不考虑新的 LD_LIBRARY_PATH
Edit2,所以问题是我们可以改变环境或其他东西,以便库加载器看到它并从那里加载吗?
最佳答案
原因
os.environ["LD_LIBRARY_PATH"] = ...
不起作用很简单:这个环境变量控制动态加载器的行为(Linux 上的ld-linux.so.2
,ld.so.1
Solaris),但加载程序仅在进程启动时查看一次 LD_LIBRARY_PATH
。在当前进程之后更改 LD_LIBRARY_PATH
的值无效(正如 this 问题的答案所说)。
您确实有一些选择:
A.如果你知道你将需要 /some/path
中的 xyz.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
中查找依赖模块。
关于python - 更改当前进程环境的 LD_LIBRARY_PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1178094/