python的os.environ

󰃭 2016-04-19

导读

python的os模块为我们提供了一套操作系统的接口, 让我们可以对目录文件以及环境等等进行操作和查看

这里我们队os模块的environ进行一些探讨

以下测试均在 ubuntu 平台

含义

os.environ 这个变量属性包含了一些环境变量和参数, 以key,value的形式展示和存储。 开发的时候, 我们可以通过其进行不同环境参数的配置和自定义。

注意, 这里的配置和自定义仅仅是对对应的key值的修改, 实际上并不会修改对应的key实际对应的值。 比如, 把HOME改成/tmp, 并不会真的将你的用户目录改到临时目录, 仅仅是一个dict的key对应的value的变化

os.environ 的变量是在第一次 import os 的时候一次性加载的, 后面对环境变量的修改都不会在os.environ 中提现出来

实践

打开你的ipython(一个python解释器),

import os
print os.environ

输出结果如下

{'LESSOPEN': '| /usr/bin/lesspipe %s', 'SSH_CLIENT': '192.168.199.182 52195 22', 'LOGNAME': 'tony', 'USER': 'tony', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games', 'HOME': '/home/tony', 'LANG': 'en_US.UTF-8', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'SHLVL': '1', 'QT_QPA_PLATFORMTHEME': 'appmenu-qt5', 'EDITOR': '/usr/bin/vim', 'env': 'dev', 'XDG_RUNTIME_DIR': '/run/user/1000',  'XDG_SESSION_ID': '1', '_': '/usr/bin/ipython', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'SSH_TTY': '/dev/pts/8', 'PWD': '/home/tony', 'MAIL': '/var/mail/tony', 'SSH_CONNECTION': '192.168.199.182 52195 192.168.199.147 22'}

从中我们可以看到我们当前shell中已有的环境变量。

os.environ 不仅可以读取已有的环境变量, 还能将我们自定义的环境变量读取到

如下, 我们在启动ipython前在shell中通过export 设置一个环境变量

export TEST_NAME="TEST"

然后我们就能在os.environ中得到这个key,value了

...'TEST_NAME': 'TEST',...

或者os.environ也可以读取shell中定义的变量(非环境变量), 但要求是启动python解释器的时候设置的shell变量(目前测试结果)

如下, 在启动ipython时候, 我们设置两个变量

shell_user="Yi_Zhi_Yu" shell_is_dev="True" ipython

然后我们就能在os.environ 中看到该key对应的value了

...'shell_user': 'Yi_Zhi_Yu', ...'shell_is_dev': 'True'...

应用

在不同的环境, 比如开发环境和线上环境, 要求项目内容要根据不同的环境加载不同的配置, 这个时候我们就可以在启动项目时, 设置env参数, 这样在不同的环境的env就不同了,我们就能加载各自对应的配置了

sudo -u <username> env=<env_name> python <start.py>