Do we need to upload virtual env on github too?

No - although the environment is 100% there, if someone else where to pull it down the path environment hasn't been exported not to mention Python version discrepancies will likely crop up.

The best thing to do is to create what is known as a requirements.txt file.

When you have created your environment, you can pip install this and pip install that. You'll start to built a number of project specific dependencies.

Once you start to build up a number of project dependencies I would then freeze your local python environment (analogoues to a package.json for node.js package dependency management). I would recommend doing the following in your terminal:

(local_python_environment) $ pip install django && pip freeze > requirements.txt

(local_python_environment) $ pip install requests && pip freeze > requirements.txt

That is to say, freeze your environment to a requirements.txt file every time a new dependency is installed.

Once a collaborator pulls down your project - they can then install a fresh python environment:

$ python3 -m venv local_python_environment

(* Please use Python 3 and not Python 2!)

And then activate that environment and install from your requirements.txt which you have included in your version control:

$ source local_python_environment/bin/activate

(local_python_environment) $ pip install -r requirements.txt

Excluding your virtual environment is probably analogous to ignoring node_modules! :)

As was mentioned in a comment it is standard to do this through a requirements.txt file instead of including the virtualenv itself.

You can easily generate this file with the following: pip freeze > requirements.txt You can then install the virtualenv packages on the target machine with: pip install -r requirements.txt

It is important to note that including the virtualenv will often not work at all as it may contain full paths for your local system. It is much better to use a requirements.txt file.