Using SPACK for virtual environments
- Environment modules (that modify
$PATH
and other environment variables, to make executables available, provide access to header files and libraries)- used with the
module
(module av
,module list
,module load
, …) andspack
(spack find
,spack load
, …) shell commands - installed in system-wide (even cluster-wide) available locations (
/trinity/shared/modulefiles/
,/home/SPACK*/
)
- Python modules (only visible to the matching version of
python
)- used with
import
in a Python script - installed system-wide (
python*/*-packages/
below/usr/lib/
) or individually by users (below~/.local/lib/
, venv/lib/
)
Please don't mix them up!
There have been recent requests for (Python) modules like astroquery.utils.tap.core
- which will not be fulfilled on a system level,
but there's a way to set up a virtual environment (“venv”) to get them installed on an individual basis.
The following steals the basic ideas from lalsuite_spack (thanks, Serguei, for paving the way and documenting it).
The command sequence
- uses SPACK to use the latest
python
andpip
- creates a virtual environment (venv) under
pip
control - activates the venv
- installs
astroquery
with all dependencies - finally leaves the venv:
Initialization, only to be done once:
Add the newest SPACK repository to $PATH
etc.:
[stefgru@login02 ~]$ . /home/SPACK2021/share/spack/setup-env.sh
(Use the latest SPACK repository! The text below was written at SPACK2019 times though.)
Load the pip
(SPACK) module with all its dependencies (the -r option is no longer required):
[stefgru@login02 ~]$ spack load py-pip
Install the virtualenv
(Python) module:
[stefgru@login02 ~]$ pip install virtualenv --user [...] Successfully installed virtualenv-16.7.7
Create a new venv:
[stefgru@login02 ~]$ virtualenv astroquery-test [...] done.
spack load py-virtualenv
, then just run the virtualenv
command (no pip
magic needed).
What may also work, using SPACK's python
(3) and the system's virtualenv
: spack load python; virtualenv –python=`which python` …
(almost completely untested and not recommended any longer!)
To initially populate the new venv:
Activate the venv:
[stefgru@login02 ~]$ . astroquery-test/bin/activate
Note that the prompt changes, to indicate you're inside the venv now!
(astroquery-test) [stefgru@login02 ~]$ module purge
This is important. If you forget this, you'll get unexpected behaviour. Check with module list
that no system or SPACK modules are loaded!
(astroquery-test) [stefgru@login02 ~]$ module list No Modulefiles Currently Loaded.
As a safety measure, bump pip
and setuptools
to the latest version:
(astroquery-test) [stefgru@login02 ~]$ pip install --upgrade pip Requirement already up-to-date: pip in ./astroquery-test/lib/python3.7/site-packages (19.3.1) (astroquery-test) [stefgru@login02 ~]$ pip install --upgrade setuptools Requirement already up-to-date: setuptools in ./astroquery-test/lib/python3.7/site-packages (41.6.0)
Now install the real payload:
(astroquery-test) [stefgru@login02 ~]$ pip install astroquery Collecting astroquery [...] Installing collected packages: numpy, astropy, chardet, certifi, idna, urllib3, requests, jeepney, six, pycparser, cffi, cryptography, secretstorage, entrypoints, keyring, soupsieve, beautifulsoup4, webencodings, html5lib, astroquery Successfully installed astropy-3.2.3 astroquery-0.3.10 beautifulsoup4-4.8.1 certifi-2019.9.11 cffi-1.13.2 chardet-3.0.4 cryptography-2.8 entrypoints-0.3 html5lib-1.0.1 idna-2.8 jeepney-0.4.1 keyring-19.2.0 numpy-1.17.3 pycparser-2.19 requests-2.22.0 secretstorage-3.1.1 six-1.13.0 soupsieve-1.9.5 urllib3-1.25.6 webencodings-0.5.1
It's time for a test now:
(astroquery-test) [stefgru@login02 ~]$ python Python 3.7.4 (default, Nov 6 2019, 17:06:47) [GCC 9.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import astroquery.utils.tap.core >>> exit()
The (Python) module is there, obviously. We're done for the setup part:
(astroquery-test) [stefgru@login02 ~]$ deactivate [stefgru@login02 ~]$
To use the venv:
[stefgru@login02 ~]$ . astroquery-test/bin/activate (astroquery-test) [stefgru@login02 ~]$ module purge (astroquery-test) [stefgru@login02 ~]$ module list No Modulefiles Currently Loaded. (astroquery-test) [stefgru@login02 ~]$ python -c "import astroquery.utils.tap.core" # you want to do real work here... (astroquery-test) [stefgru@login02 ~]$ [...] [...] (astroquery-test) [stefgru@login02 ~]$ deactivate
There's no need to go through the initialization sequence anymore as the venv “remembers” the python
and pip
that were used at its creation time!
I think that this is the minimum to get astroquery
installed - all the steps are required!