Python Virtual Environments & Package Management

Posted by Ghassan Karwchan on Wed, Aug 22, 2018

Python virtual environments, and as well package management, has a shaky history, and it has been changing a lot for last few years. Even currently, (early 2018), it is confusing because there are many tools for virtual environments (venv, virtualenv, pyvenv, pyenv). I couldn’t find one tutorial that describe everything in just one place, so I thought, I will write it down. This post is a combination of many official documentation, answers of StackOverflow, and different blog posts that I think will give you comprehensive picture, not only for the virtual environment, but for the package management as well.

Introduction

I’ve been doing Python on and off, and every time I came back to Python after a long time off, I had to learn again, what is the best virtual environment tool, and as well their package management. So, I thought I will put this tutorial, that gives a comprehensive description of the Python working environment. I will start the post with the practical side, by describing the virtual environment tools, and differences between them, and then I will go to deeper description of pip and pip ancestor, and the background of virtual environments.

Pip Installation Folder:

To compare Pip, we can think of Node’s NPM which store the packages in folder called node_modules and has only two possible locations:

  • project-level node_modules folder, which is the default option.
  • user-level (global) node_modules folder.

Python’s pip will install the packages in a site-packages folder, which can be one of two levels:

  • Machine level shared folder.
  • User level shared folder, which is the default.

But to create isolatoin for each project, Python introduce tools and protocols to install in virtual environments.

Python’s packaging tools provided two other pip-based tools that will do installation in two other levels:

  • Virtual environment level shared folder.
  • Project level installation folder.

Installation type and scenarios:

We will list here the different case of these folders and their scenarios:

User Level Shared Folder:

Without activating a virtual environment, Pip by default will install the downloaded packages either on a folder that belong to the user folder. Installation on a user folder became the default, and you can control it by this command line:

1python setup.py install --user

This is called user scheme installation mode. The folder is located:

OS Folder
Linux ~/.local/lib/python{version: x.y}/site-packages
Mac ~/Library/Python/{version: x.y}/lib/python/site-packages
Windows %APPDATA%\Python{version: x.y}\site-packages

You can check if this mode is enabled by this command line

1python -m site 

The command will display the environment variable ENABLE_USER_SITE value, which by default is true.

Machine Level Shared Folder

f the environment variable ENABLE_USER_SITE is false, then the installation will be stored on the machine folder:

OS Folder
Linux /usr/local/lib/python{version: x.y}/site-packages
Mac /usr/local/lib/python{version: x.y}/site-packages
Windows c:\Python{version: x.y}\Lib\site-packages

Virtual Environment Shared Folder

We can create an isolated virtual environment that can be shared between many users, where running pip install, will install inside that virtual environment without polluting the user level or machine level. To create a virtual environment, we use another tool called virtualenv, which can be installed with pip itself.

1pip3 install virtualenv

Then on a directory where you want to create the virtual environment, run the following command:

1virtualenv my_virtualenv

The above command will create a folder in the current directory which contain the Python executable files, and a copy of pip library, which will be used to install other packages. To begin using the virtual environment, you need to activated using

1source my_virtualenv/bin/activate
2
3# Or alternative 
4. my_virtualenv/bin/activate

The left prompt will be changed to add the name of the virtual environment. Now, any pip install, will install the packages inside the virtual environment folder.

To deactivate the virtual environment run this command:

1deactivate

Project level installation folder

Similar to NPM, Python packaging tools has a tool called Pipenv. As virtualenv, you need to install pipenv separately.

1pip install --user pipenv

Then you can start using pipenv instead of pip

1pipenv install requests

Pipenv will install the package inside site_packages folder inside the current folder, and will create a Pipfile in the current folder (similar to package.json).

To run the application that is using the current installation folder, you need to run python through pipenv itself.

1pipenv run python your-program.py