Personally I dislike pip
as a package manager for system packages as it can cause unexpected errors and/or a dependency nightmare. For me, you should always install a package using the distros package manager if available. In Ubuntu’s case, this is apt
. As an example of what I mean, recently I installed the awscli
tool on Ubuntu from the system package manager and this worked fine. Then later, I installed openstack
via pip
. I then used the openstack
command happily but then later went to use the awscli
command again, only to find it is now in a broken state. It looks like pip
upgraded a Python package being used by the awscli
. While there are things you can do to mitigate these issues, like installing a package for a given user only and not to the system as a whole, I find you can still run into issues.
Here I try to define a process for installing these kind of applications or custom scripts in isolation of each other. I am also quite keen to try and avoid having pip
installed globally if possible.
Installation
Assuming this is a fresh installation of Ubuntu, update the system and reboot:
andy@ubuntu18:~$ sudo apt update -y && sudo apt dist-upgrade -y && sudo apt autoremove -y && sudo reboot
Install some required packages:
andy@ubuntu18:~$ sudo apt install build-essential libssl-dev libffi-dev python-dev
Install python-virtualenv
and virtualenvwrapper
:
andy@ubuntu18:~$ sudo apt install python-virtualenv virtualenvwrapper
Configuration
Find the virtualenvwrapper.sh
script:
andy@ubuntu18:~$ sudo find / -iname virtualenvwrapper.sh /usr/share/virtualenvwrapper/virtualenvwrapper.sh
And the copy it to your home directory and make it executable:
andy@ubuntu18:~$ mkdir -pv ~/.local/bin mkdir: created directory '/home/andy/.local' mkdir: created directory '/home/andy/.local/bin' andy@ubuntu18:~$ sudo cp -v /usr/share/virtualenvwrapper/virtualenvwrapper.sh ~/.local/bin/ '/usr/share/virtualenvwrapper/virtualenvwrapper.sh' -> '/home/andy/.local/bin/virtualenvwrapper.sh' andy@ubuntu18:~$ sudo chmod -v u+x ~/.local/bin/virtualenvwrapper.sh mode of '/home/andy/.local/bin/virtualenvwrapper.sh' changed from 0644 (rw-r--r--) to 0744 (rwxr--r--)
Create a directory to store files relating to your projects virtual environment dependencies:
andy@ubuntu18:~$ mkdir -pv ~/.virtualenvs mkdir: created directory '/home/andy/.virtualenvs'
Create a directory to store your projects source files:
andy@ubuntu18:~$ mkdir -pv ~/Devel mkdir: created directory '/home/andy/Devel'
The below line adds an entry to your ~/.bashrc
file:
andy@ubuntu18:~$ echo -en '\n\n#virtualenvwrapper\nexport VIRTUALENVWRAPPER_PYTHON=/usr/bin/python\nexport WORKON_HOME=~/.virtualenvs\nsource ~/.local/bin/virtualenvwrapper.sh\nexport PROJECT_HOME=~/Devel\n' >> ~/.bashrc
You will also need to source
it to read in the new changes without logging out and back in from your shell:
andy@ubuntu18:~$ source ~/.bashrc
Usage
As an example use case, I will create a project to manage a simple Python project that makes use of the Python requests
package. Below we create a project called whatsmyip
.
andy@ubuntu18:~$ mkproject whatsmyip
This will create some files required for your environment within ~/.virtualenvs
. You may have also noticed that the command prompt has changed to indicate the project you are currently working on. It also indicates you working directory has changed to ~/Devel/whatsmyip
. This is shown below:
(whatsmyip) andy@ubuntu18:~/Devel/whatsmyip$
The above will create a project using Python 2. If Python 3 is required, use the following:
andy@ubuntu18:~$ mkproject -p /usr/bin/python3 whatsmyip
Create a new file called main.py
.
(whatsmyip) andy@ubuntu18:~/Devel/whatsmyip$ vim main.py
With the following contents:
import requests response = requests.get('https://httpbin.org/ip') print('Your IP is {0}'.format(response.json()['origin']))
Because this script has a dependency on the requests
module, you won’t yet be able to run it. First you will need to install requests
with pip
as follows:
(whatsmyip) andy@ubuntu18:~/Devel/whatsmyip$ pip install requests
Now if you run the script, it should return your public-facing IP:
(whatsmyip) andy@ubuntu18:~/Devel/whatsmyip$ python main.py Your IP is 129.123.5.17, 129.123.5.17
To stop working on a project, issue the deactivate
command:
(whatsmyip) andy@ubuntu18:~/Devel/whatsmyip$ deactivate andy@ubuntu18:~/Devel/whatsmyip$ cd andy@ubuntu18:~$
Note at this point, you do not have access to pip
outside of your virtual environment.
andy@ubuntu18:~$ which pip andy@ubuntu18:~$
To list the available projects, issue the workon
command:
andy@ubuntu18:~$ workon whatsmyip
Or you could also use lsvirtualenv
:
apike@ubuntu18:~$ lsvirtualenv whatsmyip =========
We clearly just have one project here. To select it and start working on it, issue the below.
apike@ubuntu18:~$ workon whatsmyip (whatsmyip) andy@ubuntu18:~/Devel/whatsmyip$
Again, note you do have access to pip
now.
(whatsmyip) andy@ubuntu18:~/Devel/whatsmyip$ which pip /home/andy/.virtualenvs/whatsmyip/bin/pip
Finally, to remove the project, first deactivate
and then remove the project using rmvirtualenv
:
andy@ubuntu18:~$ rmvirtualenv whatsmyip
Be the first to comment