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

2024-04-29 04:08:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想确保os.system('env')不包含某些特定变量myname~/.bashrc形式导出

因此,我编写了以下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

我不明白为什么我还有csj3os.system('env | grep myname')上?


Tags: envnoneifosdefenvironalldelete
2条回答

docs

Note: Calling putenv() directly does not change os.environ, so it’s better to modify os.environ.

对于unsetenv有一个类似的警告:

however, calls to unsetenv() don’t update os.environ, so it is actually preferable to delete items of os.environ.

getenv只返回来自os.environ的值,因为它是implementation shows,所以通过使用它,您会进入一种状态,当您从python中查找它时,它似乎没有设置,而实际上它在真实环境中。现在我能想到的唯一方法是使用ctypes调用cGetEnv函数。。。

如果我修改您的代码以使用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

一个好的做法是:

  • 删除myname环境变量(如果存在)
  • 运行您的函数
  • 在函数完成时还原myname环境变量。

Yu可以使用类似于本文中描述的modified_environ上下文管理器这样的东西轻松地做到这一点。

with modified_environ('myname'):
    call_my_function()

相关问题 更多 >