在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-dotenvos

环境变量是使用库函数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 文件结合起来。