<p>Python在获取环境变量的值(如<code>os.environ[‘LD_LIBRARY_PATH’]</code>或<code>os.environ[‘PATH’]</code>)时,它会将这些值从其父进程的环境(通常是bash)复制到字典中(bash进程的环境get被携带到子进程,即运行Python的实例)。</p>
<p>您可以在bash的<code>env</code>命令输出中看到这个环境变量部分。</p>
<p>您还可以通过在修改任何环境变量后引入无限循环(<code>while 1: pass</code>),从<code>/proc/<pid>/environ</code>中查看/读取这个env数据。</p>
<p>如果在python脚本中修改后,从<code>/proc/<pid>/environ</code>中看到/读取这个变量值/数据,您将看到实际变量的数据没有被修改,尽管python脚本显示了一个已修改的字典键值,但它已更新。</p>
<p>当您在python脚本中修改env变量(如<code>os.environ['LD_LIBRARY_PATH']='/<new_location>'</code>)时,实际发生的情况是它只是更新本地字典中的值,而本地字典中的值没有映射到进程的env变量部分。因此,它不会一直传播回来以反映当前流程的环境,因为<strong>只有本地字典被修改/更新/填充。</p>
<p>因此,如果希望反射新的环境变量,我们应该使用<code>execv</code>用新的环境变量数据覆盖进程的内存映像。</p>
<p><strong>示例:</strong></p>
<pre><code>new_lib = '/<new_location>'
if not new_lib in os.environ['LD_LIBRARY_PATH']:
os.environ['LD_LIBRARY_PATH'] += ':'+new_lib
try:
os.execv(sys.argv[0], sys.argv)
except Exception as e:
sys.exit('EXCEPTION: Failed to Execute under modified environment, '+e)
import xyz
#do something else
</code></pre>
<p><strong>限制</strong>:理想情况下,python不应允许对<code>os.environ</code>变量进行此类修改。
但由于没有常量字典数据类型,因此允许修改数据变量。修改这些值完全没有用处,因为除非使用<code>execv</code>,否则它在运行进程的实际环境中没有任何有用的反映。</p>