Need an example and please explain me the purpose of python-dotenv.
I am kind of confused with the documentation.
What is the use of python-dotenv?
284.5k views Asked by Dev Jalla AtThere are 6 answers
If you're starting your app from a shell such as bash or zsh, then the point of .env management utilities like (npm) dotenv or python-dotenv becomes moot.
Here's an example of how to manage .env with bash that simply, directly, and safely addresses configuration as recommended by the 12-Factor App. It also requires no additional dependencies.
Given a project hosted under ~/projects/foobar/
, create an environment file in a safe location outside your project's space (e.g. ~/.envs/foobar/dev
). Its content may look something like this:
set -a
PROJECT=foobar
DB_NAME=foobar_dev
DB_PASSWORD=5ecret
CACHE_ENABLED=
DEBUG=yes
LOG=/tmp/foobar.log
...
set +a
Then create a symlink to that file from your project's space:
$ ln -s ~/.envs/foobar/dev ~/projects/foobar/.env
The project now has a .env
file symlinking to the actual file. When you source the symlink, all variables between set -a
and set +a
are exported to the environment.
$ source ~/projects/foobar/.env
And voila! If you run python from the same shell instance you sourced the environment file, you can retrieve the latter and update your config with it:
import os
config.update(os.environ)
The point of making .env
a symlink to ~/.envs/foobar/dev
is an added precaution to listing it in .gititgnore. If for whatever reasons the file were to be checked into version control, its contents would just show that it's a link to another file.
You could set the env variables like this:
export PRIVATE_KEY=0X32323
and then read it with os
module.
import os
private_key=os.getenv("PRIVATE_KEY")
But this way, environment variable works only for the duration that shell is live. If you close the shell and restart it, you have to set environmental variable again. python-dotenv
prevents us from doing this repetitive work.For this create .env
file and add variables in this format
PRIVATE_KEY=fb6b05d6e75a93e30e22334443379292ccd29f5d815ad93a86ee23e749227
then in the file u want to access anv variables
import os
from dotenv import load_dotenv
#default directory for .env file is the current directory
#if you set .env in different directory, put the directory address load_dotenv("directory_of_.env)
load_dotenv()
load_dotenv()
will set the environment variables from .env
and we access with os
module
private_key=os.getenv("PRIVATE_KEY")
This answer is to elaborate on 1) what load_dotenv
actually does under the hood, and 2) the relationship between the os.environ
and the OS's environment variables.
As the accepted answer describes, we can store some keys & values in the .env
file and load it using the load_dotenv
; then the os.environ
contains the key-value pairs in the .env
file.
Does this mean invoking load_dotenv
added an OS environment variable? - No.
Actually, what load_dotenv
does is quite the same as os.environ['key'] = 'value'
; see the source code.
But, os.environ['key'] = 'value'
does not add this key&value as an OS environment variable; They are only valid while the Python script is running.
In other words, os.environ
contains not only the OS environment variables but also one-time variables like these.
Adding to @cannin's answer, if you want to specify the which file you want to find:
from dotenv import find_dotenv
from dotenv import load_dotenv
env_file = find_dotenv(".env.dev")
load_dotenv(env_file)
In addition to @Will's answer, the python-dotenv module comes with a find_dotenv()
that will try to find the .env file.
# settings.py
import os
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
SECRET_KEY = os.environ.get("SECRET_KEY")
DATABASE_PASSWORD = os.environ.get("DATABASE_PASSWORD")
From the Github page:
Assuming you have created the
.env
file along-side your settings module.Add the following code to your
settings.py
:.env
is a simple text file with each environment variable listed one per line, in the format of KEY="Value". The lines starting with # are ignored.