19

としてエクスポートされるos.system('env')特定の変数が含まれていないことを確認したいmyname~/.bashrcexport 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

なぜ私がまだ乗っているのか理解できませんcsj3os.system('env | grep myname')

4

2 に答える 2

27

ドキュメントから:

注: putenv() を直接呼び出しても os.environ は変更されないため、os.environ を変更することをお勧めします。

unsetenv同様の警告があります:

ただし、unsetenv() を呼び出しても os.environ は更新されないため、実際には os.environ の項目を削除することをお勧めします。

getenv実装が示すos.environように、から値を返すだけなので、それを使用すると、実際には実際の環境にあるのに、Pythonから検索したときに値が設定されていないように見える状態になります。今私が考えることができる唯一の方法は、ctypesを使用してc getenv関数を呼び出すことです...

コードを変更してos.environ、呼び出しの代わりに isnを使用するようにするとputenvunsetenvすべてが期待どおりに機能します。

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
于 2013-07-17T17:03:24.087 に答える