====== Using SPACK for virtual environments ======
//**Caveat:**// There seems to be some confusion related to the term **"module"**.
Indeed, there are two slightly separate contexts:
* 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'', ...) and ''spack'' (''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 [[clusters:minerva:lalsuite_spack]] (thanks, Serguei, for paving the way and documenting it).//
The command sequence
* uses SPACK to use the latest ''python'' and ''pip''
* 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.
On Hypatia (and Minerva now too), ''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!