After having worked on several Python projects, I have found that the easiest way to manage your development environment is to use
pip to manage your dependencies.
As a way of example, we will create a project called
my_project and install
requests (a popular Python package) in it. This will be the structure of our project:
my_project ├── my_project.py ├── requirements.txt └── venv ├── bin │ └── ... ├── include ├── lib │ └── ... ...
We need the
_$: sudo apt install python3.5-venv
Create the project directory
This is a simple step, just create a directory:
_$: mkdir my_project
Create the virtual environment
Inside our project we will create a directory called
venv (virtual environment) to hold our dependencies. Alternatively, you can call it
my_project_env or something similar if you would rather have the name of your project visible at all times. Since I am not usually changing a lot of times throughout the day from one project to another, I prefer to have a simple name.
_$: cd my_project _$: python3.5 -m venv ./venv
Activate the virtual environment
You will have to do this any time you start working on this project to have all your dependencies available. Note that when you activate your virtual environment, the shell prompt changes its name.
_$: source ./venv/bin/activate (venv)_$: ls venv
Create your project
Time to code! Let’s create a simple Python program:
# my_project.py # ------------- def main(): print("Hello, world!") if __name__ == '__main__': main()
When your project gets bigger you will surely need some Python packages to ease your development. Let’s install
requests to show how it is done:
Note: We don’t need
requests at all for our simple project. At this time it is only used as an example of a package installation using
pip in a virtual environment.
(venv)_$: pip install requests Collecting requests Downloading requests-2.18.4-py2.py3-none-any.whl (88kB) 100% |████████████████████████████████| 92kB 2.0MB/s Collecting chardet<3.1.0,>=3.0.2 (from requests) Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB) 100% |████████████████████████████████| 143kB 2.6MB/s Collecting urllib3<1.23,>=1.21.1 (from requests) Downloading urllib3-1.22-py2.py3-none-any.whl (132kB) 100% |████████████████████████████████| 133kB 2.5MB/s Collecting certifi>=2017.4.17 (from requests) Downloading certifi-2017.7.27.1-py2.py3-none-any.whl (349kB) 100% |████████████████████████████████| 358kB 2.0MB/s Collecting idna<2.7,>=2.5 (from requests) Downloading idna-2.6-py2.py3-none-any.whl (56kB) 100% |████████████████████████████████| 61kB 5.7MB/s Installing collected packages: chardet, urllib3, certifi, idna, requests Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
Apart from installing
requests it has also installed the dependencies needed for
requests to run.
Create the requirements file
It is a kind of standard practice to have a requirements file in which you specify all the packages your project depends on. In this case, we should specify only
requests since the rest of the packages installed are
requests’ dependencies, not ours.
requirements.txt: ----------------- requests==2.18.4
Once you have a requirements file, you can install all packages inside that file with the following command:
(venv)_$: pip install -r requirements.txt
Find your dependencies
After you install lots of packages you can loose track of what packages you have installed in your virtual environment. To see all your currently installed packages you can do the following:
(venv)_$: pip freeze
pip freeze shows your dependencies and your dependencies’ dependencies all mixed, so while you could create your requirements file using
pip freeze > requirements.txt it would list, and therefore save, all the packages currently installed as opposed to only your dependencies.
Deactivate your virtual environment
In case you need it, here is how to deactivate your virtual environment:
(venv)_$: deactivate _$: ls my_project.py requirements.txt venv
But you don’t have to do it, merely closing the shell works just as well.