Often times when developing software, we find the need to read values defined by other pieces of software, or even define these variables ourselves! This article will talk all about that.
Accessing global environment variables
  
  
  Using os.environ
We can get and set environment variables using the os.environ dictionnary. Getting the value of an environment variable:
>>> import os
>>> os.environ["HOME"]
'/home/username'
Setting the value of an environment variable:
>>> import os
>>> os.environ["FOO"] = "bar"
>>> os.environ["FOO"]
'bar'
Because os.environ is a mapping object, we can use .pop() to delete a variable from os.environ:
>>> import os
>>> os.environ["FOO"] = "bar"
>>> print(os.environ.get("FOO"))
bar
>>> os.environ.pop("FOO")
'bar'
>>> print(os.environ.get("FOO"))
None
If the environment variable doesn't exist, Python will raise a KeyError, to mitigate this, we can use os.environ.get() which returns None if the environment variable doesn't exist:
>>> import os
>>> bar = os.environ.get("BAR")
>>> print(bar)
None
A neat trick of os.environ.get() is setting default values. This value will be returned if the variable doesn't exist. We can achieve this by passing the default value as the second parameter of os.environ.get()
>>> import os
>>> bar = os.environ.get("BAR")
>>> print(bar)
None
>>> bar = os.environ.get("BAR", "bar")
>>> print(bar)
bar
  
  
  Using os.getenv()
Now you might be wondering: "What is the difference between os.environ.get() and os.getenv()?", well the answer is simply that there is no difference. In terms of performance, both functions perform relatively similarly:
$ python3 -m timeit -s "import os" "os.environ.get('HOME')"
500000 loops, best of 5: 730 nsec per loop
$  python3 -m timeit -s "import os" "os.getenv('HOME')"
500000 loops, best of 5: 809 nsec per loop
os.getenv's usage is quite similar to os.environ.get(), it has the same parameters and behavior:
>>> import os
>>> bar = os.getenv("BAR")
>>> print(bar)
None
>>> bar = os.getenv("BAR", "bar")
>>> print(bar)
bar
  
  
  Accessing variables in a .env file
Sometimes, we would like to write our own environment variables without interfering with other programs, whether it's to store sensitive data or just configuration options, a .env file is what you need.
  
  
  Accessing the file using configparser
The main drawback of using configparser with .env files is that configparser requires sections. Which means that your .env file will have to look like this:
[SECTION1]
VAR_1=foo
Accessing the variables:
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read(".env")
>>> var_1 = config["SECTION1"]["VAR_1"]
>>> print(var_1)
"foo"
  
  
  Accessing the file using python-dotenv
python-dotenv is a Python library which allows us to read environment variables from a .env file using the os module:
# Our .env file
FOO=bar
>>> import os
>>> from dotenv import load_dotenv
>>>
>>> load_dotenv()
>>> foo = os.getenv("FOO")
>>> print(foo)
"bar"
load_dotenv() will search for a .env file in the current directory or parent directories by default, and then loads them to make them accessible by your project. But you can also manually specify a directory:
...
load_dotenv("path/to/.env")
...
Use case: Managing sensitive data
Let's say you were working with API tokens, and didn't want to hardcode them into your code, and risk accidentally pushing it to some version control software. You would use environment variables to store your token.
# .env
TOKEN=abcdefg12345
import os
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("TOKEN")
# Do stuff with the token
...
Conclusion
In this tutorial we learned how to use the os module to access host environment variables, and also how to access variables stored in a .env file using configparser and python-dotenv.
              
    
Top comments (0)