<p>从<a href="http://docs.python.org/2/library/os#os.environ" rel="noreferrer">docs</a>:</p>
<blockquote>
<p><strong>Note:</strong> Calling putenv() directly does not change os.environ, so it’s better to modify os.environ.</p>
</blockquote>
<p>对于<code>unsetenv</code>有一个类似的警告:</p>
<blockquote>
<p>however, calls to unsetenv() don’t update os.environ, so it is actually preferable to delete items of os.environ.</p>
</blockquote>
<p><code>getenv</code>只返回来自<code>os.environ</code>的值,因为它是<a href="http://hg.python.org/cpython/file/7b81a535ad14/Lib/os.py#l740" rel="noreferrer">implementation shows</a>,所以通过使用它,您会进入一种状态,当您从python中查找它时,它似乎没有设置,而实际上它在真实环境中。现在我能想到的唯一方法是使用ctypes调用cGetEnv函数。。。</p>
<p>如果我修改您的代码以使用<code>os.environ</code>则不必调用<code>putenv</code>/<code>unsetenv</code>所有操作都按预期工作:</p>
<pre><code>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()
</code></pre>
<p>输出:</p>
<pre><code>$ 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
</code></pre>