方法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/
如果在python腳本中修改后,從/proc/
當您在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)
