python 脚本内部修改 LD_LIBRARY_PATH

方法1:
摘自 https://www.cnpython.com/qa/32448
Python在获取环境变量的值(如os.environ[‘LD_LIBRARY_PATH’]或os.environ[‘PATH’])时,它会将这些值从其父进程的环境(通常是bash)复制到字典中(bash进程的环境get被携带到子进程,即运行Python的实例)。

您可以在bash的env命令输出中看到这个环境变量部分。

您还可以通过在修改任何环境变量后引入无限循环(while 1: pass),从/proc//environ中查看/读取这个env数据。

如果在python脚本中修改后,从/proc//environ中看到/读取这个变量值/数据,您将看到实际变量的数据没有被修改,尽管python脚本显示了一个已修改的字典键值,但它已更新。

当您在python脚本中修改env变量(如os.environ['LD_LIBRARY_PATH']='/<new_location>')时,实际发生的情况是它只是更新本地字典中的值,而本地字典中的值没有映射到进程的env变量部分。因此,它不会一直传播回来以反映当前流程的环境,因为只有本地字典被修改/更新/填充。

因此,如果希望反射新的环境变量,我们应该使用execv用新的环境变量数据覆盖进程的内存映像。

示例:

new_lib = '/<new_location>'
if not new_lib in os.environ['LD_LIBRARY_PATH']:
    os.environ['LD_LIBRARY_PATH'] += ':'+new_lib
    try:
        os.execv(sys.argv[0], sys.argv)
    except Exception as e:
        sys.exit('EXCEPTION: Failed to Execute under modified environment, '+e)

import xyz
#do something else

限制:理想情况下,python不应允许对os.environ变量进行此类修改。 但由于没有常量字典数据类型,因此允许修改数据变量。修改这些值完全没有用处,因为除非使用execv,否则它在运行进程的实际环境中没有任何有用的反映。

方法2:
摘自 https://www.codenong.com/1178094/

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)
posted @ 2020-11-04 08:38  骏腾  阅读(3905)  评论(2编辑  收藏  举报