python os.environ、os.putenv、/usr/bin/env

问题描述 投票:0回答:2

我想确保

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')

python
2个回答
32
投票

来自文档

注意:直接调用putenv()不会改变os.environ,所以最好修改os.environ。

对于

unsetenv
有类似的警告:

但是,调用 unsetenv() 不会更新 os.environ,因此实际上最好删除

os.environ
的项目。

getenv
只是从
os.environ
返回值,如其 实现所示,因此通过使用它,您会进入一种状态,当您从 python 查找它时,该值似乎尚未设置,而实际上它处于真实的环境。现在我能想到的唯一方法是使用 C 类型调用 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

0
投票

一个好的做法可能是:

  • 删除
    myname
    环境变量(如果存在),
  • 运行你的函数
  • 在函数完成时恢复
    myname
    环境变量。

Yu 可以使用类似

modified_environ
上下文管理器在这个问题中描述的东西轻松做到这一点。

with modified_environ('myname'):
    call_my_function()
© www.soinside.com 2019 - 2024. All rights reserved.