在Python中从环境文件中读取环境变量
一个环境文件存储了一个程序所需要的所有依赖项,这样它就不需要与来自多个路径的包进行交互。
本文将重点介绍如何在Python中读取.env
文件,并从本地环境文件中导入环境变量。
从本地环境文件中读取环境变量
大多数现代程序使用 docker 来在环境中运行它们的程序。一个docker就像一个具有高效内存管理的替代虚拟机。
但在测试过程中,程序必须从docker容器中移除,并使用本地环境文件进行本地测试。
本文将解释如何在Python中设置本地环境文件以及导入和读取.env
文件。
为Python脚本创建一个环境文件
环境文件是通过在文本文件内提供程序的键值对并以.env
为扩展名保存来创建的。
按以下步骤创建一个.env
文件:
-
打开记事本,把环境变量写在里面。比如说、
MY_ENV_VAR="This is my env var content."
-
保存这个文件,名字后面加上
.env
的扩展名,例如,config.env
。这将创建一个.env
文件。 -
我们现在需要在
.env
文件所在的同一目录下创建一个Python脚本,以便用Python读取env
文件。
创建一个读取环境变量的Python脚本
这个程序使用python-dotenv
库,在 Python 中从本地环境文件中读取.env
文件。要安装它,请打开Command Prompt或PowerShell并编写命令:
pip install python-dotenv
一旦python-dotenv
,我们就可以继续前进,加载脚本并在Python中读取env
文件。该程序使用两个库包:python-dotenv
和os
。
环境变量是使用库函数load_dotenv()
加载到代码中的。函数load_dotenv()
,用于从.env
文件中提取环境变量。
另一个库函数是dotenv_values
,它与前面的函数类似,只是它不与环境变量交互,而是从.env
文件中返回一个带有解析值的dict
。
下面是Python程序:
import os
from dotenv import load_dotenv
load_dotenv()
MY_ENV_VAR = os.getenv('MY_ENV_VAR')
最后一行代码使用os.getenv
函数从.env
文件中导入变量MY_ENV_VAR
的值,并将其存储在 Python 程序中的一个类似名字的变量中。
打印变量MY_ENV_VAR
将显示来自.env
文件的内容:
This is my env var content.
通过运行Bash脚本读取环境变量
这是第二种方法,也解决了当程序无法在Python中读取.env
文件,而load_dotenv
库函数返回none
,而不是环境变量的问题。发生这种情况是因为.env
文件没有来源,这意味着Python程序无法读取.env
文件,无法加载数据变量。
在运行 shell 脚本的系统中,加载环境文件和运行 Python 脚本可以被包裹在一起。这允许你在一个虚拟环境中加载.env
文件,然后在这个环境中运行 Python 脚本。
这一节将展示如何加载环境变量,并将其包裹在一个 shell 脚本中,以便在 Python 中读取.env
文件。
创建一个.env
文件
这个过程与上一节中的过程相似,但不是使用像记事本那样的通用文字编辑器,而是需要一个提供EOL转换的文本编辑器。
EOL转换是指转换文本文件中的行末。要创建这样的文件,我们需要:
-
下载并安装Notepad++或任何其他提供行末转换的文本编辑器。
-
写一些环境变量,比如:
TYPE=prod PORT=5000
-
进入
Edit > EOL
转换,选择Unix(LF)。 -
用
.env
的扩展名来保存文件,例如、config.env
这将创建一个 shell 脚本可以读取的环境文件。现在,我们来写一些Python代码。
在Python中创建一个可以读取.env
文件的Python脚本
这个程序在Python中导入并读取.env
文件,不需要任何外部Python库。该程序导入库包os
,并使用库中的函数os.environ
,从变量中提取数值。
然后,提取的值被打印出来。
import os
print(os.environ.get('TYPE'))
print(os.environ.get('PORT'))
然而,这个脚本不能独立地读取Python中的.env
文件。运行该脚本会返回None
。
Win 10@DESKTOP-8MEIQB8 MINGW64 ~/try
$ python test.py
None
None
发生这种情况是因为Python脚本不能访问环境文件,即使它在同一目录内。这就是为什么要使用一个 shell 脚本,它的来源是.env
文件并同时运行 Python 脚本。
创建一个 Shell 脚本,将.env
文件加载到 Python 脚本中。
这个过程与创建环境文件相同,因为Bash命令要用Unix EOL转换来写。
在Notepad++中打开一个新的文件,然后写上Bash命令,比如:
#!/usr/bin/env bash
set -a
source config.env
set +a
python test.py
第一行代码是shebang,这是一串字符,通常需要在Bash脚本中说明。在这里,它显示了访问Bash的地方的文件路径。
set -a
允许将所有的变量导出到外面的各种子进程中。这里,这个子进程就是需要运行的Python脚本。
它是Unix函数allexport
的一个快捷方式。
环境文件被酸化,或者换句话说,使用语法source config.env
,加载到shell脚本中。-a
允许导出进入环境的.env
文件内的所有变量。
set +a
的作用与set -a
相反,它关闭了变量的导出,因此没有其他文件或代码受到影响。
最后一行代码使用语法python test.py
启动一个子进程。它在环境中运行Python脚本,用Python读取.env
文件,并返回Python脚本的输出。
一旦shell脚本里面的代码写好了,它的EOL需要转换为Unix,然后用.sh
的扩展名保存,比如run.sh
。将该文件保存在环境文件和Python脚本所在的同一目录中。
在Bash里面执行时,tree
命令会显示所有三个文件都在同一个目录里面。
jay@DESKTOP-8MEIQB8:/mnt/c/Users/Win 10/try$ tree
.
├── config.env
├── run.sh
└── test.py
完成上述步骤后,就可以运行Bash脚本了。
使用命令行运行器运行Bash脚本
像命令提示符或PowerShell这样的命令行运行器有助于在Windows中运行Bash脚本。一个更好的选择是安装git-bash
,它允许我们从Windows的任何目录中直接运行Bash。
本节将解释这两种方式。
在命令提示符或PowerShell中安装Bash
要在Windows中运行Bash,必须打开Windows Subsystem for Linux
功能或WSL。它可以在 “开启或关闭Windows功能 “选项中找到。
进入 “开始 “菜单,在搜索栏中搜索这个选项。点击它将打开一个弹出窗口,里面有一系列的选项和勾选框。向下滚动,直到你找到Windows Subsystem for Linux
,并在旁边的复选框上打勾。
一旦Windows中的WSL被打开,去微软商店安装一个Linux发行版,如Ubuntu。一旦安装完毕,重新启动计算机,Bash就可以在命令提示符和PowerShell中使用了。
要检查它是否正确安装和工作,进入命令提示符或PowerShell,然后写bash
。终端会切换到 Bash。
安装Git-Bash
WSL 方法的另一个选择是 Git-Bash 方法。Bash可以通过Git直接下载并安装到系统中。
下载后打开安装程序。选择一个喜欢的安装地点,并将所有其他设置保持为默认。
安装程序会提示多个窗口,有很多设置,请反复点击Next
,直到安装开始。
运行Shell脚本
在存放 Python 和 shell 脚本的目录中启动 Bash。如果使用的是Git-bash,直接进入该目录,右键单击并选择Git Bash Here
。
如果使用PowerShell或命令提示符,必须在进入所需目录后手动执行Bash终端。一旦进入该目录,输入命令bash
。
在Bash里面,需要运行shell脚本。在这个例子中,shell脚本被命名为run.sh
,所以运行shell脚本的Bash命令是:
./run.sh
这将激活环境,在其中运行Python脚本,并返回输出结果:
Win 10@DESKTOP-8MEIQB8 MINGW64 ~/try
$ ./run.sh
prod
5000
结论
这篇文章解释了在Python中读取.env
文件的多种方法,从.env
文件中提取环境变量,然后在Python脚本中使用它。读者应该能够轻松地创建.env
文件和Shell脚本,将Python代码和.env
文件结合起来。