(五)shell环境变量

shell变量,也就是我们所熟知的环境变量。所有的shell变量以键值对的方式存储于字典对象os.environ中,独立于Python系统。你可以在命令行窗口(比如MS-DOS)中,或者在运行的程序内部,或者控制面板的用户UI中设置环境变量。一般作为系统级的配置,应用于程序中。

一个比较典型的shell变量的例子是PYTHONPATH。该环境变量的值是路径的集合(分号隔开),这些值在python脚本启动时,或者IDLE运行时载入sys.path中,为脚本或者命令行查找加载模块提供搜索路径。在某个应用中,shell变量可以由父进程设定,然后作为其他子进程的输入参数;因为它们的值会自动被衍生的进程继承,因而可以作为一种简单的进程间通信的方法。

获取shell变量

在Python中,shell环境变量集合在一个预设定的对象中,不需要特殊的语法进行访问。如何获取环境变量的值呢?很简单,通过变量名检索os.environ就可以了(os.environ['USER']),它等价于Unix命令窗中通过美元符号访问环境变量值($USER),而DOS命令窗中则使用双百分号(%USER%),C语言则使用函数(getenv("USER"))实现。

os.environs是一个字典,可以访问它的所有键,os.environ.key(),返回的是一个键的列表。

修改shell变量

os.environ是一个字典对象,支持通过键名检索,也支持赋值。比如:os.environ['TEMP'] = r'c:\temp',修改环境变量TEMP的值。这样修改会产生额外的影响。在最新发行的Python版本中,修改os.environ键对应的值会自动导出到同个应用的其他部分。也就是说,对于运行中的进程,通过键名赋值,既改变了os.environ,也改变了与之相关的封闭的shell环境(封闭,指某个进程及其衍生进程)。新的环境变量的值对于该Python程序,以及所有链接的C模块和衍生的子进程都是可见的。

通过键名赋值修改os.environ对象,内部调用函数os.putenv。该函数可以修改处在Python解析器作用域之外的shell变量。

对os.environ的修改是封闭的,也就是说仅在当前进程和它的子进程中有效,子进程的os.environ是继承自父进程的。比如在MS-DOS中运行Python脚本,DOS窗口是顶级的父进程;在窗口运行的所有进程都是它的子进程;在Python脚本中,通过os.system语句可以启动其他的子进程,os.environ对于该脚本和该脚本中通过os.system等语句开启的子进程都是可见的。Python脚本的os.environ由shell命令窗口初始化。

在子进程启动之前,设置shell变量其实是进程通信的一种方式。例如,某个Python配置脚本程序在启用另一个Python脚本程序之前,在PYTHONPATH环境变量的结尾加上用户目录;这样子进程就可以在sys.path中获取到该目录,因为环境变量可以传递给子孙进程(而PYTHONPATH的值会添加到sys.path中)。

putenv, getenv

对os.environ的修改会自动调用os.putenv,如果系统内的C库含有putenv函数,则会被os.putenv调用。尽管修改os.environ对象会调用os.putenv,但是直接调用os.putenv不会更新os.environ。基于这个原因,通常直接修改os.environ,不使用os.putenv修改环境变量。

还有一点需要注意,环境变量只在程序启动的时候载入os.environ,并不是每次访问的时候都载入;因此,程序运行到C的子进程时,对环境变量的改动不会同步到os.environ中。另外,os.getenv内部不会调用C库中的getenv函数。如果系统不包含C版库函数putenv,则需要将os.environ作为启动的参数传递给衍生进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值