Python 使用 environs 库定义环境变量的方法
作者:崔庆才 时间:2022-06-06 08:58:51
Environs是解析环境变量的Python库。它的开发受envparse启发,底层使用marshmallow验证并序列化值。
在运行一个项目的时候,我们经常会遇到设置不同环境的需求,如设置是开发环境、测试环境还是生产环境,或者在某些设置里面可能还需要设置一些变量开关,如设置调试开关、日志开关、功能开关等等。
这些变量其实就是在项目运行时我们给项目设置的一些参数。这些参数一般情况来说,可以有两种设置方法,一种是通过命令行参数,一种是通过环境变量。二者的适用范围不同,在不同的场景下我们可以选用更方便的方式来实现参数的设置。
本节我们以 Python 项目为例,说说环境变量的设置。
设置和获取环境变量
首先,我们先来了解一下在 Python 项目里面怎样设置和获取变量。
首先让我们定义一个最简单的 Python 文件,命名为 main.py,内容如下:
import os
print(os.environ['VAR1'])
在这里我们导入了 os 模块,它的 environ 对象里面就包含了当前运行状态下的所有环境变量,它其实是一个 os._Environ 对象,我们可以通过类似字典取值的方式从中获取里面包含的环境变量的值,如代码所示。
好,接下来我们什么也不设置,直接运行,看下结果:
python3 main.py
结果如下:
raise KeyError(key) from None
KeyError: 'VAR1'
直接抛出来了一个错误,这很正常,我们此时并没有设置 VAR1 这个环境变量,当然会抛出键值异常的错误了。
接下来我们在命令行下进行设置,运行如下命令:
VAR1=germey python3 main.py
运行结果如下:
germey
可以看到我们在运行之前,在命令行之前通过键值对的形式对环境变量进行设置,程序就可以获取到 VAR1 这个值了,成功打印出来了 germey。
但这个环境变量是永久的吗?我们这次再运行一遍原来的命令:
python3 main.py
结果如下:
raise KeyError(key) from None
KeyError: 'VAR1'
嗯,又抛错了。
这说明了什么,在命令行的前面加上的这个环境变量声明只能对当前执行的命令生效。
好,那既然如此,我难道每次运行都要在命令行前面加上这些声明吗?那岂不麻烦死了。
当然有解决方法,我们使用 export 就可以了。
比如这里,我们执行如下命令:
export VAR1=germey
执行完这个命令之后,当前运行环境下 VAR1 就被设置成功了,下面我们运行的命令都能获取到 VAR1 这个环境变量了。
下面来试试,还是执行原来的命令:
python3 main.py
结果如下:
germey
可以,成功获取到了 VAR1 这个变量,后面我们运行的每一个命令就都会生效了。
但等一下,这个用了 export 就是永久生效了吗?
其实并不是,其实这个 export 只对当前的命令行运行环境生效,我们只要把命令行关掉再重新打开,之前用 export 设置的环境变量就都没有了。
可以试试,重新打开命令行,再次执行原来的命令,就会又抛出键值异常的错误了。
那又有同学会问了,我要在每次命令行运行时都想自动设置好环境变量怎么办呢?
这个就更好办了,只需要把 export 的这些命令加入到 ~/.bashrc 文件里面就好了,每次打开命令行的时候,系统都会自动先执行以下这个脚本里面的命令,这样环境变量就设置成功了。当然这里面还有很多不同的文件,如 ~/.bash_profile 、~/.zshrc 、~/.profile、/etc/profile 等等,其加载是有先后顺序的,大家感兴趣可以去了解下。
来源:https://cuiqingcai.com/8947.html