Python项目的环境变量
在开发Web应用程序或漫游器时,我们经常处理任何秘密信息,各种令牌和密码(API密钥,Web表单的秘密)。 对这些信息进行硬编码,更不用说将其存储在公开可用的版本控制系统中,是一个非常糟糕的主意。
配置文件
解决此问题的最简单方法是使用所有敏感信息创建一个单独的配置文件,并将其添加到.gitignore
。 这种方法的缺点是,在git中,您还需要保留配置文件模板,并且不要忘记定期对其进行更新。
环境变量
一种更高级的方法是使用环境变量。 环境变量被命名为变量,其中包含运行程序可以使用的文本信息。 例如,要启动flask应用程序,首先需要在环境变量FLASK_APP
指定应用程序的名称:
$ export FLASK_APP=hello.py $ flask run * Running on http://127.0.0.1:5000/
使用环境变量,您可以获得各种应用程序参数和秘密密钥:
import os app.config['API_KEY'] = os.environ.get('API_KEY')
Python-dotenv库
为了避免在每次重启终端时手动设置环境变量,可以使用python-dotenv软件包 。 它允许您从应用程序根目录中的.env
文件加载环境变量。
安装软件包:
pip install python-dotenv
现在,您可以创建一个.env文件,其中包含应用程序所需的所有环境变量。 重要的是,将.env
文件添加到.gitignore
,不要将其存储在版本控制系统中。
import os from dotenv import load_dotenv dotenv_path = os.path.join(os.path.dirname(__file__), '.env') if os.path.exists(dotenv_path): load_dotenv(dotenv_path)
该.env文件可用于所有配置变量,但不能用于FLASK_APP
和FLASK_DEBUG
环境变量,因为在应用程序的初始加载期间已经需要它们。
Direnv实用程序
进入项目文件夹时可以自动加载环境变量,这在同时处理多个项目时特别方便。 direnv实用程序允许您执行此操作。 Direnv是一个终端环境变量管理器,它支持bash,zsh,tcsh和其他shell。 允许您根据当前目录自动加载和卸载环境变量。 这使您可以拥有特定于每个项目的环境变量。 在每次邀请之前,都会检查当前目录和父目录中是否存在.envrc
文件。 如果文件存在,则将其加载到bash子模式中,然后所有导出的变量都由direnv捕获,然后可用于Shell。
安装direnv
sudo apt-get install direnv
接下来,您需要进行更改以配置我们的shell;对于bash,将以下内容添加到~/.bashrc
并重新启动控制台:
eval "$(direnv hook bash)"
Direnv的例子为项目创建一个新文件夹:
$ mkdir ~/my-project $ cd ~/my-project
我们显示未加载环境变量FLASK_APP:
$ echo $FLASK_APP nope
将环境变量写入.envrc
文件:
$ echo export FLASK_APP=hello.py > .envrc .envrc is not allowed
为了确保安全,在创建或修改.envrc
文件后,需要使用direnv allow命令进行确认:
$ direnv allow . direnv: reloading direnv: loading .envrc direnv export: +FLASK_APP
我们显示环境变量已加载:
$ echo $FLASK_APP hello.py
退出项目文件夹时,将卸载环境变量
$ cd .. direnv: unloading
再次变得不安
$ echo $FLASK_APP nope
在Direnv中使用虚拟环境
除了加载环境变量之外,direnv还允许您使用Python的虚拟环境。
虚拟环境允许您对单个项目使用不同版本的python解释器和库包。 有多种方法可以为python创建虚拟环境,这里我们看一下venv模块,有关其他选项, 请参见direnv文档 。
要使用venv自动创建和激活虚拟环境,您需要将以下代码添加到 ~/.config/direnv/direnvrc
(请参阅文档) 。
创建虚拟环境
如果在.envrc
文件中添加一行
layout python-venv
然后转到文件夹direnv将在direnv文件夹中创建一个虚拟环境,例如.direnv/python-venv-3.7.3
。
要创建具有不同路径的虚拟环境,例如,在更加熟悉的venv文件夹中,您需要设置VIRTUAL_ENV
变量:
export VIRTUAL_ENV=.venv
同样,您可以连接一个已经创建的虚拟环境。
使用不同版本的Python
要安装非系统版本的python,您需要使用以下命令:
layout python-venv python3.6
创建一个bash提示字符串(PS1)
与手动激活虚拟环境不同,在本例中,bash提示符(PS1)不会更改(通常看起来(venv) user@comp:~$
)。 要将虚拟环境激活显示返回到控制台,请将以下代码添加到~/.bashrc
:
show_virtual_env() { if [[ -n "$VIRTUAL_ENV" && -n "$DIRENV_DIR" ]]; then echo "($(basename $VIRTUAL_ENV))" fi } export -f show_virtual_env PS1='$(show_virtual_env)'$PS1
样本.envrc
文件配置文件
这是配置用于开发flask应用程序的.envrc
文件可能类似于:
export VIRTUAL_ENV=venv layout python-venv export FLASK_APP=app.py export FLASK_DEBUG=1
这使您可以在进入项目文件夹时自动激活虚拟环境并加载环境变量。
