Complete guide to Python Virtual Environments

~ 6 min read

By Daniel Diaz

Virtual environments are a crucial part of creating Python projects. In this tutorial, you'll learn everything about them.

Why virtual environments?

Virtual environments are a crucial part of making Python projects because they allow you to have separated packages for every project you are working on.

It allows us to code with different versions of our needed packages on every project we are working on, and maintain the packages of our local machine intact.

An example could be managing different projects of Django, with different versions like 2.x or the newer 3.x. This could be just because of preferences, or for a business requirement (Since companies usually use older versions of packages).

The cherry on the cake is that Virtual environments allow developers to share the needed packages for the project they are working on, with a simple file normally called requirements.txt and a short command on the terminal.๐Ÿš€

So with this brief introduction, letโ€™s get into Virtual environments.๐Ÿค“

Different Virtual environments

There are many virtual environment tools for Python, but Iโ€™ll talk about the main two.

Take into account that these two are really similar so you can easily use one or another.

Virtualenv

The virtualenv package is a fully powered tool that allows you to create and manage virtual environments in Python.

It is an external package and you can install it with:

pip install virtualenv

Python -m venv

Since Python 3.3, an abstracted version of virtualenv is included as a built-in package, and therefore it doesnโ€™t require any installation.

Differences between virtualenv and built-in venv

Virtualenv is a third-party package for managing virtual environments, and it requires installation, while venv is a built-in virtual environment package that is just a subset of virtualenv, and doesnโ€™t require installation.

One of the other main differences is that virtualenv supports Python 2.x and Python 3.x, while the built-in method is just available since Python 3.3.

You can find an extensive differentiation here.

Hands-on tutorial

Now letโ€™s use these tools to build what we love, software. ๐Ÿ–ฅ๏ธ

Open your terminal, and type the following commands:

To open a terminal in VS code

VSCode
VSCode

Click on the top bar Terminal, and click again in New Terminal.

New Terminal
New Terminal

  • Virtualenv
virtualenv .venv
  • venv
python3 -m .venv

Where the name .venv, could be any name you want to give to your virtual environment. ๐Ÿ’ก

Note: Remember that no matter what of these two tools you use the following steps will be always the same, the only thing that changes is the creation of the venv.

Venv structure

The structure of a virtual environment is the following

.
โ”œโ”€โ”€ bin
โ”‚ย ย  โ”œโ”€โ”€ activate
โ”‚ย ย  โ”œโ”€โ”€ activate.csh
โ”‚ย ย  โ”œโ”€โ”€ activate.fish
โ”‚ย ย  โ”œโ”€โ”€ Activate.ps1
โ”‚ย ย  โ”œโ”€โ”€ easy_install
โ”‚ย ย  โ”œโ”€โ”€ easy_install-3.8
โ”‚ย ย  โ”œโ”€โ”€ pip
โ”‚ย ย  โ”œโ”€โ”€ pip3
โ”‚ย ย  โ”œโ”€โ”€ pip3.8
โ”‚ย ย  โ”œโ”€โ”€ python -> /usr/bin/python
โ”‚ย ย  โ””โ”€โ”€ python3 -> python
โ”œโ”€โ”€ include
โ”œโ”€โ”€ lib
โ”‚ย ย  โ””โ”€โ”€ python3.8
โ”‚ย ย      โ””โ”€โ”€ site-packages
โ”‚ย ย          A lot of packages ...
โ”‚
โ”œโ”€โ”€ lib64 -> lib
โ””โ”€โ”€ pyvenv.cfg

131 directories, 1056 files

Where did all this stuff come? ๐Ÿคฏ. Well, this looks scary but donโ€™t worry.

The bin folder contains all the Python binaries and the activation scripts, we will see later how to activate it.

The lib folder contains all of the modules by itself, for example, if you are looking for a function definition of a library, probably your editor will redirect you to the lib folder, where all the modules are located.

# looking for the "UserCreationForm" class on Django 

.venv/lib/python3.8/site-packages/django/contrib/auth/forms.py

Activating and deactivating virtual environments

Before we continue Iโ€™d like to show you another crucial command while working with virtual environments.

pip freeze

pip freeze will print in the console all the packages available to the Python interpreter you are using.

If you do it on your local machine you will get something like this.


โ•ฐโ”€ฮป pip freeze                                                                                  alembic==1.4.3
apparmor==3.0.0
appdirs==1.4.4
asn1crypto==1.4.0
astroid==2.4.2
attrs==20.3.0
autopep8==1.5.4
Babel==2.8.1
bcrypt==3.2.0
Beaker==1.11.0
blinker==1.4
btrfsutil==5.9
CacheControl==0.12.6
cairocffi==1.2.0
catfish==1.4.13
ceph==1.0.0
ceph-volume==1.0.0
cephfs==2.0.0
cephfs-shell==0.0.1
cffi==1.14.3
chardet==3.0.4
click==7.1.2
colorama==0.4.4
configobj==5.0.6
contextlib2==0.6.0.post1
cryptography==3.2.1
etc ...

Those are all the packages that your Python interpreter has installed (and its versions). A pretty huge collection isnโ€™t it? ๐Ÿ˜.

Now letโ€™s activate the virtual environment, called .venv

# .venv is the name of the virtual environment
# Activation for a bash shell in Linux or Mac
source .venv/bin/activate

Activating a venv in other shells

Depending on the shell you use, probably you will use a different command, so take a look at the following table.

Command table
Command table

In my case since I use fish as my primary shell, I always use activate.fish.

You will notice a little change in your terminal, and itโ€™s because you get a little graphic of what environment are you using.

In my case:

.venv command
.venv command

After that little parenthesis, run pip freeze again, what do you get?

Exactly, Nothing

You donโ€™t get output, just because the virtual env, has a totally isolated Python interpreter instance, with its own libraries installed. ๐Ÿ˜ฎ

Deactivating Virtual environments

Deactivating an environment is pretty easy, just run

deactivate

You will notice that you donโ€™t have the name of the venv in your terminal, and if you run pip freeze, you will get all your installed packages.

Installing packages

Before installing any package be sure to have your venv activated!

Depending on which project you are working on, you will want to install the latest and greatest versions, or a specific version.

To install the latest packages with pip just run:

pip install {package}

For example

# Installing it
pip install requests

# pip freeze
certifi==2020.12.5
chardet==4.0.0
idna==2.10
requests==2.25.1
urllib3==1.26.3

Installing a specific version

To install a specific version of a package, run pip install {package name}=={version number}

# Installing Django 2.2

pip install django==2.2

# pip freeze

Django==2.2
pytz==2021.1
sqlparse==0.4.1

Remember that if you want to check the Django version, just invoke python and run the following code.

โ•ฐ(.venv)โ”€ฮป python                                                                             
Python 3.8.6 (default, Sep 30 2020, 04:00:38) 
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print(django.get_version())
2.2

Installing packages from a text file

To install the packages from a text file just run.

pip install -r {name of the file}.txt
# Usually the file is named requirements.txt

This is extremely useful when you are collaborating in a Python project, and with just a command you get all the necessary stuff to start coding.

To write all your packages in a file run this command.

pip freeze > requirements.txt

This will generate a file named requirements.txt, which content will be the output of pip freeze.

This way is how most specialized servers install the needed packages, to deploy python apps. You give them a file with the requirements and not the virtualenv itself.

Conclusion

Now that you know how to use Virtual environments, you can:

  • Separate the requirements for each of your projects
  • Install different versions of packages
  • Collaborate easily since with just a command or two, you can set up your environment
  • Donโ€™t mess around with the libraries of your machine ๐Ÿ˜…

Commands shortcut:

# Install virtualenv, and create one
pip install virtualenv
virtualenv {venv name}

# Built in method (Python 3.3 +)
python -m venv {venv name}

# Activating
source {venv name}/bin/activate

# Deactivating
deactivate

# Install from file
pip install -r {file}.txt

# Write a file
pip freeze > requirements.txt

Any doubts, let me know!

Read Next ๐Ÿ“–