zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    golang 反射和利用反射取结构体值
    golang 实现Lru
    跨域
    JS原型链
    cookie 、sessionStorage与localStorage的区别
    计算真实div盒子的宽度和高度
    div水平垂直居中
    清除浮动的几种方法
    JS中for循环和定时器的小问题
    转换字符串和转换数字类型
  • 原文地址:https://www.cnblogs.com/zi-wang/p/13924077.html
Copyright © 2011-2022 走看看