环境变量,2022-11-01

(2022.11.01 Tues)
环境变量environment variable是动态命名(dynamic-named)的值,可以影响电脑中正在运行的进程的行为。他们是进程所运行环境的一部。比如,进程可以查询环境变量TEMP的值用于找到存放临时文件的适当位置;查询ev HOMEUSERPROFILE的值以找到使用当前值进程用户的路径结构(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时,指定环境变量DEBUGTRUE

>> 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.

你可能感兴趣的:(环境变量,2022-11-01)