(2022.11.01 Tues)
环境变量environment variable是动态命名(dynamic-named)的值,可以影响电脑中正在运行的进程的行为。他们是进程所运行环境的一部。比如,进程可以查询环境变量TEMP
的值用于找到存放临时文件的适当位置;查询ev HOME
或USERPROFILE
的值以找到使用当前值进程用户的路径结构(directory structure);当打开一个程序时,查询PATH
确定程序所在的路径。
环境变量应用的典型案例:打开一种编程语言的编译器,比如Java。用户在terminal中输入java
,系统会从PATH
中查找其中哪个路径下有该可运行的文件,一旦找到则开始运行。
环境变量分系统变量和用户变量,比如在Windows系统中可以在环境变量设置中看到system variable和user variables。
关于环境变量的操作
在系统中
Linux和Mac的UNIX中查看环境变量的命令为
>> export
declare -x CONDA_DEFAULT_ENV="base"
declare -x CONDA_EXE="/Users//opt/anaconda3/bin/conda"
declare -x CONDA_PROMPT_MODIFIER="(base) "
declare -x CONDA_PYTHON_EXE="/Users//opt/anaconda3/bin/python"
declare -x CONDA_SHLVL="1"
declare -x HOME="/Users/"
...
查看特定环境变量的命令是echo $
,如查看PATH
变量中的内容
>> echo $PATH
/usr/local/bin:/usr/local/sbin:/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
注意到Linux和Unix中,一个变量中并列有若干值,这些值之间用冒号:
隔开,windows系统中用分号;
隔开。
修改环境变量有多种方式,适用范围不同,适用于用户或系统,可依次尝试。
- 用户级ev定义文件:~/.bashrc、~/.profile或~/.bash_profile
- 系统级ev定义文件:/etc/bashrc、/etc/profile或/etc/bash_profile、/etc/environment
更新环境变量的极简方式如下,该方法仅修改当前用户当前窗口中的环境变量,而一旦用户关闭窗口,修改将回滚。持久化修改请在上面提到的文件的结尾加入对应指令。
修改
>> export VAR_NAME=xxxxx
>> export PWD=/Users
加入新内容
>> export VAR_NAME=$VAR_NAME:xxx
>> export VAR_NAME=xxx:$VAR_NAME
>> export PATH=$PATH:/etc/lib
>> echo $PATH
/usr/local/bin:/usr/local/sbin:/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/etc/lib
在Python中修改
- 使用内置的
os
包
>> import os
>> ev = os.environ
>> type(ev)
>> ev
environ({'TERM_SESSION_ID': 'w0t0p0:E6CB3C38-C647-4549-ABF4-82292A4EAC2D',
'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.8F8q60v7Nj/Listeners',
'LC_TERMINAL_VERSION': '3.4.16', 'COLORFGBG': '7;0',
'ITERM_PROFILE': 'Default', 'XPC_FLAGS': '0x0', 'PWD': '/Users/jeffcheung',
'SHELL': '/bin/zsh', 'LC_CTYPE': 'UTF-8', 'TERM_PROGRAM_VERSION': '3.4.16',
'TERM_PROGRAM': 'iTerm.app',
'PATH': '/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin',
'LC_TERMINAL': 'iTerm2', 'COLORTERM': 'truecolor', 'TERM': 'xterm-256color',
'HOME': '/Users/jeffcheung',...)
# 获取
>> os.getenv("PATH")
'/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin'
>> ev.get("PATH") # 返回相同结果
(2022.11.03 Thur)
- 使用内置的
sys
包
在Python中调用sys.path
指令,可以返回当前的所有路径(环境变量)。这些路径保存为一个list。特别地,在一个.py
脚本中执行该命令,则list中index为0的元素代表了该文件所在的路径。当脚本中执行import
操作时,按路径依次查找需要的module/package。
# /Users/jeffcheung/Documents/blog/2022年/学习笔记/sys_path.py
import sys
if __name__ == '__main__':
print(f"sys.path: {sys.path}")
运行该脚本,返回结果如下,注意list中的第一个元素和该脚本的路径相同。
>> python sys_path.py
sys.path:
['/Users/jeffcheung/Documents/blog/2022年/学习笔记',
'/Users/jeffcheung/opt/anaconda3/lib/python39.zip',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/lib-dynload',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/site-packages',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/site-packages/aeosa',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/site-packages/locket-0.2.1-py3.9.egg']
(2023.04.16 Sun)
- 在运行Python脚本时指定特定环境变量的值,并用
python xxx.py
的格式运行脚本。注意,该方法在Linux和Mac中有效。
格式如
EVN_VAR=VALUE python
如运行脚本test.py
时,指定环境变量DEBUG为TRUE
>> DEBUG=TRUE python test.py
此时指定的环境变量,只在该脚本运行的环境空间中有效(environment space)。
(2023.04.16 Sun)
在.env
文件中定义环境变量
前面的方法有的需要修改全局环境变量,如果不同的项目对环境变量的要求不同,将会产生一些麻烦。一个通用的方法是在不同的项目中定义针对该项目的环境变量。具体方法是在项目根目录中创建一个.env
文件,该文件仅供项目专用。
.env
是一个文本文件,包含项目/应用中需要指定的环境变量的键值对(key-value pairs)。该文件只保存在项目本地(project local)而勿须保存在源码控制工具(e.g., github)中。其形式如下
DEBUG=TRUE
CONDA_DEFAULT_ENV=base
各种编程语言都有对应的方法读.env
文件中环境变量。在Python中可使用loadenv
这个工具包以及其中的loadenv
方法载入.env
的环境变量。如下面案例,在当前路劲中创建.env
文件并写入PASSCODE=123
这个环境变量,用dotenv.loadenv
载入环境变量,并用os.environ
可读取该变量。
>> import dotenv
>> dotenv.loadenv()
>> import os
>> os.environ['PASSCODE']
123
dotenv.loadenv
在查找.env
文件时首先在当前路径下寻找,如果当前路径不存在该文件就去parent directory查找,以此类推。除此之外,还可在加载时显示地指定.env
路径
>> dotenv.loadenv("/home/user/z/codes/.env")
-
.env
文件的安全性
很多情况下环境变量中包含敏感信息诸如密码和API key等。显然这些信息不适合保存在git等源码控制工具中。
针对这种情况的标准操作是将.env
排除在提交给源码控制工具的代码中。对于Git,只需在.gitignore
文件中加入.env
的信息。这样可保证提交代码时不提交.env
文件。如果打算提交.env
文件的末班,可加一个.env.exam
或者其他名字的文件到git中,使代码使用者可了解需要在本地设置哪些环境变量。
Reference
网络
1 Understanding Python imports, _init_.py and pythonpath — once and for all, towardsdatascience, Dr Varshita Sher
2 python docs modules.