Python3 - Virtual Environments
Tags: python, programming, tutorial, opensource
Published: 2022-03-10 03:31:58


In python, any interpreter you install by default works on the global environment which is not unique to each project. So, any project you start, for the packages needed, when installed or uninstalled they'll have an impact on the global environment.

<hr>

### Why Virtual environment

For example Project_A and Project_B requires a certain package to work, lets call this package PackageB.
At first it doesn't seem like a big deal, but lets say the two projects need a different version of the same package (PackageB), this is where the issue arises.

A good approach to solving this issue is introducing a Virtual environment. It solves this by isolating each project in a seperate environment. In this case, any package installed in the virtual environment are specific to that environment i.e they are only installed in that environment alone when activated.

As we proceed, i'll show you how to setup and activate a virtuanenv for python3

<hr>
### Install virtualenv for Python3
Here are some of the prerequisite for setting up a virtualenv
- Python3
- pip

**1** To install Virtualenv with python3 run `python3 -m pip -U install virtualenv`.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ok1tqb0m7u3ej20bodm.jpg)


**2** After installing, we need to check the directory where python3 is installed on the system, to do this run `where python3`

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xnnfcuacrevoyk6shobe.jpg)

In my case it's `C:/Users/HP/AppData/Local/Microsoft/WindowsApps/python3.exe`.
<hr>

### Create the Virtualenv

**1** After getting the python3 path, the next step is to create the virtual environment. To do this i first create my working folder `python-venv` then navigate to this folder using `cd python-venv`.

`python3 -m venv /path-to-new-virtual-environment`

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/emk001ge5mlj3a134yvk.png)
 
In the screenshot above, i used a relative path instead of the full path, for more on this refer to my previous article on [Relative and absolute paths](https://dev.to/realrichi3/relative-and-absolute-paths-2ll6)

**2** 
If you navigate to your new venv folder you will notice a set of new folders (Lib, Include, Scripts), it shows that your venv was created successfully.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5d6ogzv1sqxi5w0pr4uk.PNG)


**3** Now your virtual environment is set. To check for available commands and options for working with virtualenvs run

`python -m venv -h` this will display more like a reference summary of different command options available

![vevn help reference](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kkne08e5nniuubfffsv2.png)

<hr>

### Activate the virtualenv

At the current state if we run pip install any package, it will still install them globally, which is not what we want. In order to  install packages to our virtualenv we have to activate it. 

To activate the virtualenc, navigate to the root directory of the virtualenv and run `.\scripts\activate` (note the slash direction).


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8gyu1b1sho4jctfwrwjy.png)

If your environment is activated you’ll see (python-venv) before your path in your terminal prompt like in the image above. Now all packages installed will be in the new virtualenv.

To deactivate an active virtualenv, run `deactivate` 

<hr>

### Exporting the virtualenv
Let's say you successfully finished a program that required you to install certain packages using pip, and you want your program to be available to others, a problem will arise since they'll need the exact packages and version. To fix this we have to export a list of packages used. To do this run `pip freeze > requirements.txt`. This command exports a list of the packages to the requirements.txt file which can later be installed by others using `pip install -r requirements.txt`