python os.environ,os.putenv,/ usr / bin / env
问题内容:
我想确保os.system('env')
不包含某些特定的变量myname
导出~/.bashrc
为export myname=csj
因此,我在下面编写了python代码:
import os
def print_all():
print "os.environ['myname']=%s" % os.environ.get('myname')
print "os.getenv('myname')=%s" % os.getenv('myname')
os.system('env | grep myname')
print
def delete_myname():
if 'myname' in os.environ: os.environ.pop('myname')
if os.getenv('myname'): os.unsetenv('myname')
print_all()
os.putenv('myname', 'csj2')
print "---------------------"
delete_myname()
print_all()
os.putenv('myname', 'csj3')
print "---------------------"
delete_myname()
print_all()
我认为,同时检查os.environ['myname']
和os.getenv('myname')
后是否存在删除它们,可以确保os.system('env | grep myname')
得到什么。
但是,结果是:
os.environ['myname']=csj
os.getenv('myname')=csj
myname=csj
---------------------
os.environ['myname']=None
os.getenv('myname')=None
---------------------
os.environ['myname']=None
os.getenv('myname')=None
myname=csj3
我不明白为什么我仍然坚持csj3
下去os.system('env | grep myname')
?
问题答案:
从文档:
注意: 直接调用putenv()不会更改os.environ,因此最好修改os.environ。
因为unsetenv
有类似的警告:
但是,对unsetenv()的调用不会更新os.environ,因此实际上最好删除os.environ的项。
getenv
刚刚返回从价值os.environ
,因为它的实施显示,所以通过使用它,你进入它似乎当你从蟒蛇看看它的值未设置,而它实际上可以是在真实环境中的状态。现在我能想到的唯一方法是使用ctypes调用c
getenv函数。
如果我修改您的代码以使用而os.environ
不是调用putenv
/unsetenv
一切都按预期工作:
import os
def print_all():
print "os.environ['myname']=%s" % (os.environ['myname'] if 'myname' in os.environ else "None")
os.system('env | grep myname')
print
def delete_myname():
if 'myname' in os.environ: os.environ.pop('myname')
print_all()
os.environ['myname'] = 'csj2'
print "---------------------"
print_all()
delete_myname()
print_all()
os.environ['myname'] = 'csj3'
print "---------------------"
print_all()
delete_myname()
print_all()
输出:
$ myname=somevalue python2 test.py
os.environ['myname']=somevalue
myname=somevalue
---------------------
os.environ['myname']=csj2
myname=csj2
os.environ['myname']=None
---------------------
os.environ['myname']=csj3
myname=csj3
os.environ['myname']=None