更改当前进程环境的LD_LIBRARY_PATH

Anu*_*yal 22 python shared-libraries environment-variables

是否有可能改变当前流程的环境变量?

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

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

编辑:我想我需要提一下,我已经尝试过像os.environ这样的东西["LD_LIBRARY_PATH"] = mypath os.putenv('LD_LIBRARY_PATH',mypath)

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

Edit2,所以问题是我们可以改变环境或其他东西,以便库加载器看到它并从那里加载吗?

Emp*_*ian 33

原因

os.environ["LD_LIBRARY_PATH"] = ...
Run Code Online (Sandbox Code Playgroud)

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

你有一些选择:

答:如果你知道你将需要xyz.so/some/path和控制Python脚本从一开始执行,那么只需设置LD_LIBRARY_PATH自己的喜好(后检查尚未如此设置),并重新执行自己.这是做什么的Java.

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

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

  • 优秀; 谢谢.事实证明,从Python 2.6开始,不推荐使用`dl`模块,但你也可以使用`import ctypes; ctypes.cdll.LoadLibrary( "/一些/路径/ xyz.so")`. (4认同)
  • @JasonR选项B可以使用`import dl实现; dl.open( "/一些/路径/ xyz.so")` (2认同)

cri*_*sti 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)
Run Code Online (Sandbox Code Playgroud)