Travailler dans un environnement Python

Configuration

python est disponible sur les système linux et est donc présent sur le calculateur, dans l’environnement du système. Il est cependant recommandé d’utiliser une version de python disponible sous forme de modules Easybuild. Cela permet en effet d’exploiter des modules Easybuild précompilés avec des versions de Python compatibles d’une part et d’autre part de construire des environnements virtuels localement lorsque c’est nécessaire.

Pour connaître les versions de Python disponibles sous forme de module, effectuer une commande du type

module avail |& grep -i ^Python

Certains modules Python sont précompilés et disponibles sous forme de module, par exemple

module load GObject-Introspection/1.64.0-GCCcore-9.3.0-Python-3.8.2

Dans ce cas, si vous chargez d’autres modules de Python, ils dépendront de cette version.

Localement, si les modules Python dont vous avez besoin ne sont pas disponibles, vous pouvez les charger dans votre environnement de travail, de préférence dans un environnement virtuel ou avec la suite conda.

Environnement virtuel

Charger une version de Python disponible dans les modules, par exemple

module load Python/3.9.5-GCCcore-10.3.0

Intialiser l’environnement virtuel avec

python -m venv .venv
source .venv/bin/activate

et installer les paquets pip dont vous avez besoin, par exemple

pip install numpy

L’environnement se quitte par

deactivate

Pour définir les modules intallés dans l’environnement, lorsqu’il est activé, vous pouvez faire

pip freeze > requirements.txt

Le fichier requirements.txt contient les modules, leur version et toutes les dépendances qui ont été installées avec. Par exemple, si les modules suivants sont chargés à la main,

pip install matplotlib
pip install numpy
pip install h5py
pip install cmocean
pip install scipy
pip install nmmn
pip install astropy

Le fichier requirements.txt ressemble à

astropy==5.1
asttokens==2.0.8
backcall==0.2.0
build==0.8.0
click==8.1.3
cmocean==2.0
contourpy==1.0.5
cycler==0.11.0
decorator==5.1.1
executing==1.0.0
fonttools==4.37.3
h5py==3.7.0
ipython==8.5.0
jedi==0.18.1
kiwisolver==1.4.4
matplotlib==3.6.0
matplotlib-inline==0.1.6
nmmn==0.8.9
numpy==1.23.3
packaging==21.3
parso==0.8.3
pep517==0.13.0
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.2.0
pip-chill==1.0.1
pip-tools==6.8.0
prompt-toolkit==3.0.31
ptyprocess==0.7.0
pure-eval==0.2.2
pyerfa==2.0.0.1
Pygments==2.13.0
pyparsing==3.0.9
python-dateutil==2.8.2
PyYAML==6.0
scipy==1.9.1
six==1.16.0
stack-data==0.5.0
tomli==2.0.1
traitlets==5.4.0
wcwidth==0.2.5

Pour répliquer l’installation dans un nouvel environnement virtuel, il suffit de le charger dans le nouvel environnement activé via

pip freeze -r requirements.txt

Si on ne veut pas exiger des versions identiques des modules, alors, elles peuvent être négligées au chargement par exemple en faisant

pip freeze | cut -d"=" -f1 > requirements.txt

Parfois, il est plus intéressant de ne charger que les modules indispensables, sans spécifier les dépendances. Pour cela, il est possibe d’installer pip-chill dans l’environnement via

pip install pip-chill

L’extraction des modules chargés, sans leurs dépendances, s’obtient par la commande

pip-chill --no-version > requirements.in

et dans ce cas, requirements.in ressemble à

astropy
cmocean
h5py
ipython
matplotlib
nmmn
pip-chill
scipy

Les dépendances peuvent être retrouvées en installant au préalable pip-tools avec

pip install pip-tools

et en faisant par exemple

pip-compile --output-file=requirements.txt requirements.in

et le fichier requirements.txt permet de lire les dépendances entre les modules. Il ressemble à

astropy==5.1
    # via -r requirements.in
asttokens==2.0.8
    # via stack-data
backcall==0.2.0
    # via ipython
build==0.8.0
    # via pip-tools
click==8.1.3
    # via pip-tools
cmocean==2.0
    # via -r requirements.in
contourpy==1.0.5
    # via matplotlib
cycler==0.11.0
    # via matplotlib
decorator==5.1.1
    # via ipython
executing==1.1.0
    # via stack-data
fonttools==4.37.4
    # via matplotlib
h5py==3.7.0
    # via -r requirements.in
ipython==8.5.0
    # via -r requirements.in
jedi==0.18.1
    # via ipython
kiwisolver==1.4.4
    # via matplotlib
matplotlib==3.6.0
    # via -r requirements.in
matplotlib-inline==0.1.6
    # via ipython
nmmn==0.8.9
    # via -r requirements.in
numpy==1.23.3
    # via
    #   astropy
    #   contourpy
    #   h5py
    #   matplotlib
    #   pyerfa
    #   scipy
packaging==21.3
    # via
    #   astropy
    #   build
    #   matplotlib
parso==0.8.3
    # via jedi
pep517==0.13.0
    # via build
pexpect==4.8.0
    # via ipython
pickleshare==0.7.5
    # via ipython
pillow==9.2.0
    # via matplotlib
pip-chill==1.0.1
    # via -r requirements.in
pip-tools==6.8.0
    # via -r requirements.in
prompt-toolkit==3.0.31
    # via ipython
ptyprocess==0.7.0
    # via pexpect
pure-eval==0.2.2
    # via stack-data
pyerfa==2.0.0.1
    # via astropy
pygments==2.13.0
    # via ipython
pyparsing==3.0.9
    # via
    #   matplotlib
    #   packaging
python-dateutil==2.8.2
    # via matplotlib
pyyaml==6.0
    # via astropy
scipy==1.9.1
    # via -r requirements.in
six==1.16.0
    # via
    #   asttokens
    #   python-dateutil
stack-data==0.5.1
    # via ipython
tomli==2.0.1
    # via
    #   build
    #   pep517
traitlets==5.4.0
    # via
    #   ipython
    #   matplotlib-inline
wcwidth==0.2.5
    # via prompt-toolkit
wheel==0.37.1
    # via pip-tools

Conda

Charger une version de conda disponible dans les modules, en choisissanr parmi les sorties de

module avail |& grep -i conda

vérifier la version de Python associée après avoir chargé le module. Par exemple,

module load Anaconda3/2022.05

La création de l’environnement s’effectue avec la commande

conda create --name <environment-name>

et l’environnement s’active avec

source activate <environment-name>

Il se quitte par

source deactivate