Arch Linux python paths
isolation, debian-style
I've been a Debian user for many years, and Debian does some smart things with its python packaging, facilitating isolation of python modules installed by the OS package manager from python modules installed by setuptools/pip. This is not only convenient, but also follows the Filesystem Hierarchy Standard, which states that "locally installed software must be placed within /usr/local rather than /usr unless it is being installed to replace or upgrade software in /usr."
I've recently started running Arch Linux on my laptop instead of Ubuntu,
and the "Arch Way" is
to avoid patching upstream at all cost. I just ran into
some issues with python and a polluted mess of both pacman-installed and
pip-installed packages in the singular site-packages directory under /usr
.
So I partially recreated the Debian-style isolation in Arch by leveraging the
sitecustomize module, which is
reserved specifically for this kind of thing. I created
/usr/lib/python2.7/site-packages/sitecustomize.py
and
/usr/lib/python3.4/site-packages/sitecustomize.py
with the following content:
import osimport siteimport sysPYTHON = 'python' + sys.version[:3]SITE = os.path.join('/usr', 'lib', PYTHON, 'site-packages')LOCAL = os.path.join('/usr', 'local', 'lib', PYTHON, 'site-packages')def get_site_index():index = -1for path in sys.path:index += 1if path == SITE:return indexreturn Noneindex = get_site_index()site.addsitedir(LOCAL)if index:sys.path.pop(index)sys.path.insert((index + 1), SITE)
This inserts /usr/local/lib/pythonX.y/site-packages
into the python path just
before /usr/lib/pythonX.y/site-packages
. (An alternative option would be to
use a .pth file to refer to the /usr/local
path, but this would place the
local packages after the pacman packages, and I want my local packages to
take precedence.)
Now I can use pip to install modules into /usr/local
by passing it
--install-option="--prefix=/usr/local"
. Of course, I'm not going
to remember to always use that flag, so I created /root/.pip/pip.conf
as
follows:
[install]install-option=--prefix=/usr/local
Now I can pip install
away, and my pip-installed modules will end up in
/usr/local
, safe from the clutches of pacman. I just have to remember to copy
sitecustomize.py
into site-packages
for any new versions of python.
Personally, I think the usability (not to mention FHS compliance) that Debian-style isolation provides should trump the philosophy of the "Arch Way," but I'm not even going to try to convince the Arch maintainers of that. C'est la vie.