问题1:通过export ABCD=abcd方式设置环境变量,获取不到设置值
>>> import commands
>>> import os
>>> cmd = "export ABCD=abcd"
>>> env = commands.getoutput(cmd)
>>> print os.getenv("ABCD")
None
>>>
问题2:通过os.environ[‘ABCD’] = 'abcd’方式设置环境变量,可以获取到设置值,但只在Python进程中有效,执行完毕后无法获取
>>> import os
>>> cmd = "export ABCD=abcd"
>>> os.environ['ABCD'] = 'abcd'
>>> print os.getenv("ABCD")
abcd
>>>
退出后,查询环境变量,查不到
[root@localhost ~]# env|grep ABCD
[root@localhost ~]#
或将其写成脚本
#!/usr/lib/python
# -*- coding: UTF-8 -*-
import os
def set_env():
os.environ['ABCD'] = 'abcd'
env = os.getenv("ABCD")
print env
if __name__ == "__main__":
set_env()
执行:
[root@localhost env]# python ./env.py;echo $ABCD
abcd
[root@localhost env]#
设置成功了观景变量ABCD,但是还是取不到值。
问题分析:
对于环境变量的设置来说,Python直接执行export ABCD=abcd
是无法设置成功的,设置方法可以通过os.environ['ABCD'] = 'abcd'
来设置,但是由于Python运行是启动新的进程,设置的环境变量只在该进程内有效,所以env.py执行完毕后也无法再获取到设置的环境变量。
解决办法:
我们都知道直接在shell中执行export ABCD=abcdefg
是可以成功设置的,也就是说在标准输出中执行该命令是可以设置为session级别的环境变量(其实也是进程级别,在shell中在启动进程就属于该shell的子进程是可以继承父进程的环境变量),所以可以通过echo $ABCD
命令再次查到结果。
如:
[root@localhost ~]# export ABCD=abcdefg
[root@localhost ~]# echo $ABCD
abcdefg
[root@localhost ~]#
所以要通过Python脚本设置环境变量,就可以将export命令定向到标准输出,即print
更改脚本为:
#!/usr/lib/python
# -*- coding: UTF-8 -*-
import os
from pipes import quote
def set_env():
print "export ABCD={};".format(quote("abcd"))
if __name__ == "__main__":
set_env()
执行:
[root@localhost env]# eval $(python ./env.py);echo $ABCD
abcd
[root@localhost env]# env|grep ABCD
ABCD=abcd
[root@localhost env]#