美文网首页
环境变量,2022-11-01

环境变量,2022-11-01

作者: Mc杰夫 | 来源:发表于2022-10-31 23:44 被阅读0次

    (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系统中用分号;隔开。

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

    • 用户级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)
    <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)

    • 使用内置的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 <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文件的安全性
      很多情况下环境变量中包含敏感信息诸如密码和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

          本文链接:https://www.haomeiwen.com/subject/kgvdtdtx.html