Python is a fantastic language that continues to help so many businesses and individuals. It offers readable syntax to get started, yet extensive amounts of control and flexibility to move into the more advanced areas of software engineering. Python the number one choice for many because it is packed with the power of unparalleled libraries, it recommended to run them through a python virtual environment.

Conventionally, running a python script from the terminal is as simple as calling it and passing in the script needed to be executed.


Note that we only discuss Python version 3 these days, as Python 2 had it’s “end of life” at the beginning of 2020; long overdue.

Let’s say that in I have the following code.

import pandas as pd

def runme():
  data = {"country": ["Brazil", "Russia", "India", "China", "South Africa"],
          "capital": ["Brasilia", "Moscow", "New Dehli", "Beijing", "Pretoria"],
          "area": [8.516, 17.10, 3.286, 9.597, 1.221],
          "population": [200.4, 143.5, 1252, 1357, 52.98] }
  df = pd.DataFrame(data)

if __name__ == '__main__':

This prints out a table of five columns, showing some facts about the locations.

If we try and run this as is, we will get the following error:

$ python3
Traceback (most recent call last):
  File "", line 1, in <module>
    import pandas as pd
ModuleNotFoundError: No module named 'pandas'

So we will naturally run a pip install pandas, or a pip3 install pandas as we are calling the python3 binary when we run our script.

What this does, is goes to PyPi (Python’s Package Index) and gets the relevant library, then installs it locally to where our Python executable is being run from.

While this will fix our problem, over time, it creates another problem. That is to say that we will end up with a global python directory, full of dependencies that we don’t particularly need for every project.

To fix this, we introduce virtual environments.

What is a Python Virtual Environment?

A Python Virtual Environment is a directory locally configured to a python project that contains all the necessary things to run python, such as the python binaries, libraries and other tidbits.

To get a python virtual environment setup, you will first need to install the virtualenv global package; which may or may not be available on your machine already.

The easiest way to get started is to run pip install virtualenv, or pip3 install virtualenv. You can read more about it here if required.

Now that you have virtualenv available to your local machine, you can make use of it within your above application, simply set it up!

$ ls

We can see that there is only the one file available in the working directory.

How to Setup a Python Virtual Environment

By running virtualenv -p python3 venv, we tell Virtual Environment to install Python3 in the venv local directory. You should see an output similar to the following:

$ virtualenv -p python3 venv
Running virtualenv with interpreter /usr/local/bin/python3
Already using interpreter /usr/local/opt/python/bin/python3.7
Using base prefix '/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/ao/src/tmp/test2/venv/bin/python3.7
Also creating executable in /Users/ao/src/tmp/test2/venv/bin/python
Installing setuptools, pip, wheel...

If we list all files in the directory now, we will see our additional Virtual Environment is available.

$ ls venv

All it takes to use this environment, is to activate it. This can be done by typing source venv/bin/activate, alternatively, you can also replace the source keyword with a period . instead; as following: . venv/bin/activate.

~ source venv/bin/activate
(venv) ~

We can now see the virtual environment’s name within our terminal window. At this stage, any python commands executed are from within our local virtual environment.

Installing python packages into the Virtual Environments

At this stage, we can now run python as we did before. Notice that we are now only running python, as opposed to python3 from before. This is because we told the virtual environment to install python as python3 (virtualenv -p python3 venv).

$ python
Traceback (most recent call last):
  File "", line 1, in <module>
    import pandas as pd
ModuleNotFoundError: No module named 'pandas'

Unfortunately, we still get the same error, but that is easily fixed by running a pip install pandas. Which will now install the package to our local virtual environment.

$ pip install pandas
Collecting pandas
  Using cached pandas-0.25.3-cp37-cp37m-macosx_10_9_x86_64.whl (10.2 MB)
Collecting numpy>=1.13.3
  Downloading numpy-1.18.1-cp37-cp37m-macosx_10_9_x86_64.whl (15.1 MB)
     |████████████████████████████████| 15.1 MB 9.7 MB/s
Collecting pytz>=2017.2
  Using cached pytz-2019.3-py2.py3-none-any.whl (509 kB)
Collecting python-dateutil>=2.6.1
  Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
     |████████████████████████████████| 227 kB 14.5 MB/s
Collecting six>=1.5
  Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: numpy, pytz, six, python-dateutil, pandas
Successfully installed numpy-1.18.1 pandas-0.25.3 python-dateutil-2.8.1 pytz-2019.3 six-1.14.0

python now runs our application successfully!

    country    capital    area  population
 0        Brazil   Brasilia   8.516      200.40
 1        Russia     Moscow  17.100      143.50
 2         India  New Dehli   3.286     1252.00
 3         China    Beijing   9.597     1357.00
 4  South Africa   Pretoria   1.221       52.98

Exporting / Freezing Packages for Later

It is good to practise to export – or freeze as it’s called in the python world – any packages you may have used. This helps other developers get your application running with a few commands, as opposed to having to figure out what needed to be installed first.

Running a pip freeze > requirements.txt will dump all currently used dependencies into a requirements.txt file. This is the common convention typically followed.

Note that this will dump all the dependencies of the python virtual environment into this file, as we created a new virtual environment at the beginning of this tutorial, only packages used for this script will be exported, or frozen. If you had to do this from your globally installed python/pip, you may find many more unnecessary packages included; yet another reason to use virtual environments.

Taking a look at our requirements.txt file, we can now see the following:

$ cat requirements.txt