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.
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)