环境变量,2022-11-01

2022-10-31  本文已影响0人  Mc杰夫

(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/<username>/opt/anaconda3/bin/conda"
declare -x CONDA_PROMPT_MODIFIER="(base) "
declare -x CONDA_PYTHON_EXE="/Users/<username>/opt/anaconda3/bin/python"
declare -x CONDA_SHLVL="1"
declare -x HOME="/Users/<username>"
...

查看特定环境变量的命令是echo $<var_name>,如查看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系统中用分号;隔开。

修改环境变量有多种方式,适用范围不同,适用于用户或系统,可依次尝试。

更新环境变量的极简方式如下,该方法仅修改当前用户当前窗口中的环境变量,而一旦用户关闭窗口,修改将回滚。持久化修改请在上面提到的文件的结尾加入对应指令。
修改

>> 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中修改

>> import os
>> ev = os.environ
>> type(ev)
<class 'os._Environ'>
>> 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)

# /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)

EVN_VAR=VALUE python <xxx.py>

如运行脚本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排除在提交给源码控制工具的代码中。对于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.

上一篇 下一篇

猜你喜欢

热点阅读