Some tricks with pip install

TL;DR Don't user sudo python setup.py intall use pip install -e ./ --user

I regularly Go through the following process:

  1. Python packages are confusing
  2. I should read the docs
  3. pip is cool
  4. I have no idea what I am doing

But this time I actually learned something useful.

Background 1: easy_install and pip

If you have spent any reasonable amount of time you have probably learned about easy_install and pip. You have probably also generally learned that easy_install is not good and should be replaced with pip in most cases.

Background 2: Working with Package Source

So pip install works fabulously with packages in PyPI, but that does not help you if you work with actual package source. If you deal with the source for python package source there are three common ways to deal with developing and testing on the package source itself.

  1. Work in the same directory as the package source
  2. Modify sys.path to add your working directory
  3. Install the package using sudo python ./setup.py install

One and Two are just fragile, crazy, and if you have ever tried it you know somewhere in the back of your head this is bad. Three is theoretically the right way to install and test python Packages, but it has a number of downsides.

  1. Requires sudo
  2. Leaves a build directory owned by root
  3. Needs to be re-run every time the source changes
  4. Can't easily uninstall packages installed this way

Useful Thing 1: Using pip for local source installation

sudo pip install ./ can be used instead of setup.py. The solves the second and fourth problem on our list. No more build directory is left behind after the installation and sudo pip uninstall <Package> will uninstall the package in one command

Useful Thing 2: Installing in non-System paths

Adding a --user flag to pip install puts the installed package at ~/Library instead of /Library. Because ~/Library is owned by the user and not root there is no need for sudo.

By adding the -e flag to pip a symlink to the source source is installed instead of the byte-code compiled source. It is not really a symlink, but it is a close enough analogy to understand what is happening.

Summary

Developing and Testing Packages locally can be greatly improved by using pip install -e ./ --user. This keeps the "installed" package up to date with the source and can be easy uninstalled with pip uninstall <Package>