diff --git a/README.md b/README.md index 30fbc18..d31b4e0 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,7 @@ If you have any feature requests, feel free to raise an issue or contact us by e # Table of contents 1. [Introduction](#introduction) 2. [Environment Setup](#environment-setup) - - [Install Miniconda](#install-miniconda) - - [Create conda environment](#create-conda-environment) + - [Create mamba environment](#create-mamba-environment) - [Run scripts on jupyter kernel](#run-scripts-on-jupyter-kernel) 3. [Example Plots](#example-plots) - [Map Plot](#map-plot) @@ -41,11 +40,25 @@ If you have any feature requests, feel free to raise an issue or contact us by e # Getting started with psyplot ## Environment Setup -We recommend to use a conda environment for the usage of the provided scripts. Please follow the instruction for the installation. +We recommend to use a conda environment created with mamba for the usage of the provided scripts. Please follow the instruction for the installation. -### Install Miniconda
- Instructions + Instructions to install Mamba (recommended) + +1. See [Mamba documentation](https://mamba.readthedocs.io/en/latest/mamba-installation.html#mamba-install) for help. +2. Do a fresh install of mambaforge on your `$HOME` directory (default location); + + wget "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" + + bash Mambaforge-$(uname)-$(uname -m).sh + +3. Restart your shell to use mamba. +4. Install all environments on your `$PROJECT` directory (Piz Daint) or on your `$SCRATCH` (Tsa), otherwise you risk filling up your $HOME directory. See below for instructions. + +
+ +
+ Instructions to install Conda 1. Look up most recent Miniconda version for Linux 64-bit on the [Miniconda documentation pages](https://docs.conda.io/en/latest/miniconda.html) 2. Install miniconda on your `$HOME` directory (default location); @@ -58,30 +71,30 @@ We recommend to use a conda environment for the usage of the provided scripts. P
-### Create conda environment +### Create mamba environment In the following instructions replace $PROJECT by $SCRATCH if using Tsa (instead of Piz Daint). -Create a conda environment _psyplot_ with python[version>=3.7,<3.10] (psy-view requirement) and install requirements: +Create a mamba environment _psyplot_ with python[version>=3.7,<3.10] (psy-view requirement) and install requirements (if you want to use conda instead and run into troubles, you can use the pinned environment ```env/environment_pinned.yml```): - conda env create --prefix $PROJECT/envs/psyplot -f env/environment.yml + mamba env create --prefix $PROJECT/envs/psyplot -f env/environment.yml -To be able to activate your conda environment by simply using `conda activate psyplot` instead of the full path, add the following to your `.bashrc`: +To be able to activate your mamba environment by simply using `mamba activate psyplot` instead of the full path, add the following to your `.bashrc`: export CONDA_ENVS_PATH=$PROJECT/envs -Activate environment (use "source activate" in case "conda activate" does not work): +Activate environment: - conda activate psyplot + mamba activate psyplot If you already have the environment but want to update it: - conda env update --file env/environment.yml --prune + mamba env update --file env/environment.yml --prune -If you are using the conda setup and want to use GRIB data, you will need to set the ```GRIB_DEFINITION_PATH```. This can be done on Tsa/Daint by sourcing the script ```setup-conda-env.sh```. It only needs to be run a single time, as it will save the ```GRIB_DEFINITION_PATH``` environment variable to the conda environment. You will need to deactivate and reactivate the conda environment after doing this. You can check it has been correctly set by ```conda env config vars list```. This script also sets the Fieldextra path, which is used for data interpolation. See [FAQs](#trouble-shooting) if you get an error running this. +If you are using the mamba setup and want to use GRIB data, you will need to set the ```GRIB_DEFINITION_PATH```. This can be done on Tsa/Daint by sourcing the script ```setup-conda-env.sh```. It only needs to be run a single time, as it will save the ```GRIB_DEFINITION_PATH``` environment variable to the mamba environment. You will need to deactivate and reactivate the mamba environment after doing this. You can check it has been correctly set by ```mamba env config vars list```. This script also sets the Fieldextra path, which is used for data interpolation. See [FAQs](#trouble-shooting) if you get an error running this. source env/setup-conda-env.sh -After creating the virtual environment and installing the requirements, the environment only needs to be activated for future usage. Make sure that the path is exported to ```~/miniconda3/bin```. +After creating the virtual environment and installing the requirements, the environment only needs to be activated for future usage. Make sure that the path is exported to ```~/mambaforge/bin```. ### Run scripts on jupyter kernel If you have jupyter notebook installed, you can run the ipython scripts (.ipynb) by opening ```jupyter notebook``` after sourcing your _psyplot_ environment. For Piz Daint please follow the instructions below. @@ -91,13 +104,13 @@ If you have jupyter notebook installed, you can run the ipython scripts (.ipynb) For running the ipython scripts on Piz Daint, you need to follow the instructions on [JupyterLab on CSCS](https://user.cscs.ch/tools/interactive/jupyterlab/), which are summarized here for icon-vis: -Load the modules daint-gpu and jupyter-utils (before activating the conda environment!) +Load the modules daint-gpu and jupyter-utils (before activating the mamba environment!) module load daint-gpu jupyter-utils Then, activate your _psyplot_ environment - conda activate psyplot + mamba activate psyplot Create psyplot-kernel: @@ -107,7 +120,7 @@ It may be necessary to export the CONDA_PREFIX, the GRIB_DEFINITION_PATH and the vim $HOME/.local/share/jupyter/kernels/psyplot-kernel/launcher -and add the following lines after the first line (make sure the CONDA_PREFIX points to where YOUR conda environment is located): +and add the following lines after the first line (make sure the CONDA_PREFIX points to where YOUR mamba environment is located): export CONDA_PREFIX=$PROJECT/envs/psyplot @@ -402,17 +415,21 @@ cfgrib.open_datasets(f_grib2, engine="cfgrib", backend_kwargs={'indexpath': '', Deactivate your environment and uninstall the package causing the error with `pip uninstall`. Now activate your environment again and the package should now point to the right location. Update your conda environment if not. -8. *TypeError: an integer is required* +8. *ValueError("Incomplete shapefiele definition " (...)* + +Check if all installed packages point to your environment, i.e. to */project/g110/username/envs/psyplot* and not to */users/username/.local/lib/python3.9/site-packages/*. You can check that by running `mamba env update --file env/environment.yml --prune` and looking at the paths for the packages where the requirements are already satisfied. If there are packages pointing NOT to your psyplot environment, run `pip uninstall ` and afterwards `mamba env update --file env/environment.yml --prune` again. + +9. *TypeError: an integer is required* This error points at an incompatibility between the installed library versions and the base python version. While the cause for this error is not fully understood, loading the python module corresponding to your system from `env/setup-conda-env.sh` before installing conda helped in the past. -9. *Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding +10. *Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding Python runtime state: core initialized LookupError: no codec search functions registered: can't find encoding* The content of your miniconda repo might have been deleted (happens regularly on scratch). Follow the [instructions](#install-miniconda) to reinstall miniconda. -10. *Something like:* +11. *Something like:* ``` -bash: export: `QUERY:=': not a valid identifier -bash: export: `COSMO-ECCODES-DEFINITIONS@2.19.0.7%GCC@8.3.0/COSMODEFINITIONS/DEFINITIONS/:==>': not a valid identifier @@ -422,7 +439,7 @@ The content of your miniconda repo might have been deleted (happens regularly on This error is due to same changes on Daint on 10.9.2022. To solve this issue, you need to delete your local conda version and [install miniconda](#install-miniconda) again. Don't forget to pull the newest version of icon-vis before installing the psyplot environment again. -11. Conda error on Daint: +12. Conda error on Daint: ``` Could not find platform independent libraries Consider setting $PYTHONHOME to [:] diff --git a/env/environment.yml b/env/environment.yml index 3e8532a..d0a2870 100644 --- a/env/environment.yml +++ b/env/environment.yml @@ -1,28 +1,24 @@ channels: - conda-forge -- defaults +- nodefaults dependencies: -- python=3.9.14 +- python=3.9.16 - git=2.34.1 - pip - cfgrib>=0.9.9.1 - eccodes=2.25.0 +- numpy<1.24 +- xarray +- netcdf4 +- pytest - psy-reg - psy-maps - cartopy -- psy-view -- numpy<1.24 - matplotlib[version='<3.5'] -- geos -- proj -- xarray -- jupyter - ipympl - cmcrameri -- ipython -- netcdf4 +- jupyter - pyinterp -- pytest - pip: - git+https://github.com/psyplot/psy-transect#egg=psy-transect - iconarray==0.3.2 diff --git a/env/environment_pinned.yml b/env/environment_pinned.yml new file mode 100644 index 0000000..4beb555 --- /dev/null +++ b/env/environment_pinned.yml @@ -0,0 +1,381 @@ +channels: +- conda-forge +- defaults +dependencies: +- _libgcc_mutex=0.1 +- _openmp_mutex=4.5 +- alsa-lib=1.2.8 +- anyio=4.0.0 +- argon2-cffi=23.1.0 +- argon2-cffi-bindings=21.2.0 +- arrow=1.2.3 +- asttokens=2.4.0 +- async-lru=2.0.4 +- attr=2.5.1 +- attrs=23.1.0 +- aws-c-auth=0.7.0 +- aws-c-cal=0.6.0 +- aws-c-common=0.8.23 +- aws-c-compression=0.2.17 +- aws-c-event-stream=0.3.1 +- aws-c-http=0.7.11 +- aws-c-io=0.13.28 +- aws-c-mqtt=0.8.14 +- aws-c-s3=0.3.13 +- aws-c-sdkutils=0.1.11 +- aws-checksums=0.1.16 +- aws-crt-cpp=0.20.3 +- aws-sdk-cpp=1.10.57 +- babel=2.12.1 +- backcall=0.2.0 +- backports=1.0 +- backports.functools_lru_cache=1.6.5 +- beautifulsoup4=4.12.2 +- bleach=6.0.0 +- bokeh=3.2.2 +- brotli-python=1.0.9 +- bzip2=1.0.8 +- c-ares=1.19.1 +- ca-certificates=2023.7.22 +- cached-property=1.5.2 +- cached_property=1.5.2 +- cairo=1.16.0 +- cartopy=0.22.0 +- certifi=2023.7.22 +- cffi=1.15.1 +- cfgrib=0.9.10.4 +- cfgv=3.3.1 +- cftime=1.6.2 +- charset-normalizer=3.2.0 +- click=8.1.7 +- cloudpickle=2.2.1 +- cmcrameri=1.7 +- colorama=0.4.6 +- comm=0.1.4 +- contourpy=1.1.0 +- curl=8.1.2 +- cycler=0.11.0 +- cytoolz=0.12.2 +- dask=2023.9.1 +- dask-core=2023.9.1 +- dbus=1.13.6 +- debugpy=1.7.0 +- decorator=5.1.1 +- defusedxml=0.7.1 +- distlib=0.3.7 +- distributed=2023.9.1 +- docrep=0.3.2 +- eccodes=2.25.0 +- entrypoints=0.4 +- exceptiongroup=1.1.3 +- executing=1.2.0 +- expat=2.5.0 +- fftw=3.3.10 +- filelock=3.12.3 +- findlibs=0.0.5 +- font-ttf-dejavu-sans-mono=2.37 +- font-ttf-inconsolata=3.000 +- font-ttf-source-code-pro=2.038 +- font-ttf-ubuntu=0.83 +- fontconfig=2.14.2 +- fonts-conda-ecosystem=1 +- fonts-conda-forge=1 +- fqdn=1.5.1 +- freeglut=3.2.2 +- freetype=2.12.1 +- fsspec=2023.9.0 +- funcargparse=0.2.5 +- geos=3.12.0 +- gettext=0.21.1 +- gflags=2.2.2 +- git=2.34.1 +- glib=2.74.1 +- glib-tools=2.74.1 +- glog=0.6.0 +- gmp=6.2.1 +- graphite2=1.3.13 +- gst-plugins-base=1.22.0 +- gstreamer=1.22.0 +- gstreamer-orc=0.4.34 +- harfbuzz=6.0.0 +- hdf4=4.2.15 +- hdf5=1.12.1 +- icu=70.1 +- identify=2.5.28 +- idna=3.4 +- importlib-metadata=6.8.0 +- importlib_metadata=6.8.0 +- importlib_resources=6.0.1 +- iniconfig=2.0.0 +- ipykernel=6.25.2 +- ipympl=0.9.3 +- ipython=8.15.0 +- ipython_genutils=0.2.0 +- ipywidgets=8.1.0 +- isoduration=20.11.0 +- jack=1.9.22 +- jasper=2.0.33 +- jedi=0.19.0 +- jinja2=3.1.2 +- jpeg=9e +- json5=0.9.14 +- jsonpointer=2.0 +- jsonschema=4.19.0 +- jsonschema-specifications=2023.7.1 +- jsonschema-with-format-nongpl=4.19.0 +- jupyter=1.0.0 +- jupyter-lsp=2.2.0 +- jupyter_client=8.3.1 +- jupyter_console=6.6.3 +- jupyter_core=5.3.1 +- jupyter_events=0.7.0 +- jupyter_server=2.7.3 +- jupyter_server_terminals=0.4.4 +- jupyterlab=4.0.5 +- jupyterlab_pygments=0.2.2 +- jupyterlab_server=2.24.0 +- jupyterlab_widgets=3.0.8 +- keyutils=1.6.1 +- kiwisolver=1.4.5 +- krb5=1.20.1 +- lame=3.100 +- lcms2=2.15 +- ld_impl_linux-64=2.40 +- lerc=4.0.0 +- libabseil=20230125.3 +- libaec=1.0.6 +- libarrow=12.0.1 +- libblas=3.9.0 +- libbrotlicommon=1.0.9 +- libbrotlidec=1.0.9 +- libbrotlienc=1.0.9 +- libcap=2.67 +- libcblas=3.9.0 +- libclang=15.0.7 +- libclang13=15.0.7 +- libcrc32c=1.1.2 +- libcups=2.3.3 +- libcurl=8.1.2 +- libdb=6.2.32 +- libdeflate=1.17 +- libedit=3.1.20191231 +- libev=4.33 +- libevent=2.1.10 +- libexpat=2.5.0 +- libffi=3.4.2 +- libflac=1.4.3 +- libgcc-ng=13.2.0 +- libgcrypt=1.10.1 +- libgfortran-ng=13.2.0 +- libgfortran5=13.2.0 +- libglib=2.74.1 +- libglu=9.0.0 +- libgomp=13.2.0 +- libgoogle-cloud=2.12.0 +- libgpg-error=1.47 +- libgrpc=1.56.2 +- libiconv=1.17 +- liblapack=3.9.0 +- libllvm15=15.0.7 +- libnetcdf=4.8.1 +- libnghttp2=1.52.0 +- libnsl=2.0.0 +- libnuma=2.0.16 +- libogg=1.3.4 +- libopenblas=0.3.24 +- libopus=1.3.1 +- libpng=1.6.39 +- libpq=15.3 +- libprotobuf=4.23.3 +- libsndfile=1.2.2 +- libsodium=1.0.18 +- libsqlite=3.43.0 +- libssh2=1.11.0 +- libstdcxx-ng=13.2.0 +- libsystemd0=253 +- libthrift=0.18.1 +- libtiff=4.5.0 +- libtool=2.4.7 +- libudev1=253 +- libutf8proc=2.8.0 +- libuuid=2.38.1 +- libvorbis=1.3.7 +- libwebp-base=1.3.1 +- libxcb=1.13 +- libxkbcommon=1.5.0 +- libxml2=2.10.3 +- libzip=1.10.1 +- libzlib=1.2.13 +- locket=1.0.0 +- lz4=4.3.2 +- lz4-c=1.9.4 +- markupsafe=2.1.3 +- matplotlib=3.4.3 +- matplotlib-base=3.4.3 +- matplotlib-inline=0.1.6 +- mistune=3.0.1 +- mpg123=1.31.3 +- msgpack-python=1.0.5 +- mysql-common=8.0.33 +- mysql-libs=8.0.33 +- nbclient=0.8.0 +- nbconvert=7.8.0 +- nbconvert-core=7.8.0 +- nbconvert-pandoc=7.8.0 +- nbformat=5.9.2 +- ncurses=6.4 +- nest-asyncio=1.5.6 +- netcdf4=1.6.0 +- nodeenv=1.8.0 +- notebook=7.0.3 +- notebook-shim=0.2.3 +- nspr=4.35 +- nss=3.92 +- numpy=1.23.5 +- openblas=0.3.24 +- openjpeg=2.5.0 +- openssl=3.1.2 +- orc=1.9.0 +- overrides=7.4.0 +- packaging=23.1 +- pandas=2.1.0 +- pandoc=3.1.3 +- pandocfilters=1.5.0 +- parso=0.8.3 +- partd=1.4.0 +- patsy=0.5.3 +- pcre2=10.37 +- perl=5.32.1 +- pexpect=4.8.0 +- pickleshare=0.7.5 +- pillow=9.4.0 +- pip=23.2.1 +- pixman=0.40.0 +- pkgutil-resolve-name=1.3.10 +- platformdirs=3.10.0 +- pluggy=1.3.0 +- ply=3.11 +- pooch=1.7.0 +- pre-commit=3.4.0 +- proj=9.2.1 +- prometheus_client=0.17.1 +- prompt-toolkit=3.0.39 +- prompt_toolkit=3.0.39 +- psutil=5.9.5 +- psy-maps=1.4.2 +- psy-reg=1.4.0 +- psy-simple=1.4.1 +- psyplot=1.4.3 +- pthread-stubs=0.4 +- ptyprocess=0.7.0 +- pulseaudio=16.1 +- pulseaudio-client=16.1 +- pulseaudio-daemon=16.1 +- pure_eval=0.2.2 +- pyarrow=12.0.1 +- pycparser=2.21 +- pygments=2.16.1 +- pyinterp=2023.5.0 +- pyparsing=3.1.1 +- pyproj=3.6.0 +- pyqt=5.15.9 +- pyqt5-sip=12.12.2 +- pyshp=2.3.1 +- pysocks=1.7.1 +- pytest=7.4.2 +- python=3.9.16 +- python-dateutil=2.8.2 +- python-eccodes=1.4.0 +- python-fastjsonschema=2.18.0 +- python-json-logger=2.0.7 +- python-tzdata=2023.3 +- python_abi=3.9 +- pytz=2023.3.post1 +- pyyaml=6.0.1 +- pyzmq=25.1.1 +- qt-main=5.15.8 +- qtconsole=5.4.4 +- qtconsole-base=5.4.4 +- qtpy=2.4.0 +- rdma-core=28.9 +- re2=2023.03.02 +- readline=8.2 +- referencing=0.30.2 +- requests=2.31.0 +- rfc3339-validator=0.1.4 +- rfc3986-validator=0.1.1 +- rpds-py=0.10.2 +- s2n=1.3.46 +- scipy=1.11.2 +- send2trash=1.8.2 +- setuptools=68.1.2 +- shapely=2.0.1 +- sip=6.7.11 +- six=1.16.0 +- snappy=1.1.10 +- sniffio=1.3.0 +- sortedcontainers=2.4.0 +- soupsieve=2.5 +- sqlite=3.43.0 +- stack_data=0.6.2 +- statsmodels=0.14.0 +- tblib=1.7.0 +- terminado=0.17.1 +- tinycss2=1.2.1 +- tk=8.6.12 +- toml=0.10.2 +- tomli=2.0.1 +- toolz=0.12.0 +- tornado=6.3.3 +- traitlets=5.9.0 +- typing-extensions=4.7.1 +- typing_extensions=4.7.1 +- typing_utils=0.1.0 +- tzdata=2023c +- ucx=1.14.1 +- ukkonen=1.0.1 +- uri-template=1.3.0 +- urllib3=2.0.4 +- virtualenv=20.24.4 +- wcwidth=0.2.6 +- webcolors=1.13 +- webencodings=0.5.1 +- websocket-client=1.6.3 +- wheel=0.41.2 +- widgetsnbextension=4.0.8 +- xarray=2023.7.0 +- xcb-util=0.4.0 +- xcb-util-image=0.4.0 +- xcb-util-keysyms=0.4.0 +- xcb-util-renderutil=0.3.9 +- xcb-util-wm=0.4.1 +- xkeyboard-config=2.38 +- xorg-fixesproto=5.0 +- xorg-inputproto=2.3.2 +- xorg-kbproto=1.0.7 +- xorg-libice=1.1.1 +- xorg-libsm=1.2.4 +- xorg-libx11=1.8.4 +- xorg-libxau=1.0.11 +- xorg-libxdmcp=1.1.3 +- xorg-libxext=1.3.4 +- xorg-libxfixes=5.0.3 +- xorg-libxi=1.7.10 +- xorg-libxrender=0.9.10 +- xorg-renderproto=0.11.1 +- xorg-xextproto=7.3.0 +- xorg-xproto=7.0.31 +- xyzservices=2023.7.0 +- xz=5.2.6 +- yaml=0.2.5 +- zeromq=4.3.4 +- zict=3.0.0 +- zipp=3.16.2 +- zlib=1.2.13 +- zstd=1.5.5 +- pip: + - iconarray==0.3.2 + - joblib==1.3.2 + - git+https://github.com/psyplot/psy-transect#egg=psy-transect + - scikit-learn==1.3.0 + - threadpoolctl==3.2.0 diff --git a/testsuite/Jenkinsfile b/testsuite/Jenkinsfile index 4e6dc4c..bd7e47f 100644 --- a/testsuite/Jenkinsfile +++ b/testsuite/Jenkinsfile @@ -55,7 +55,7 @@ pipeline { stages { stage('setup miniconda') { options { - timeout(time: 4, unit: 'HOURS') + timeout(time: 1, unit: 'HOURS') } environment { PATH = "$WORKSPACE/miniconda_$NODE_NAME/bin:$PATH" @@ -76,7 +76,7 @@ pipeline { } stage('run tests') { options { - timeout(time: 10, unit: 'MINUTES') + timeout(time: 20, unit: 'MINUTES') } environment { PATH = "$WORKSPACE/miniconda_${NODE_NAME}/bin:$PATH" diff --git a/testsuite/setup.sh b/testsuite/setup.sh index 91dc889..1145d00 100755 --- a/testsuite/setup.sh +++ b/testsuite/setup.sh @@ -1,19 +1,19 @@ #!/bin/bash -# This setup script is used by the Jenkinsfile to setup miniconda and create a conda environment. +# This setup script is used by the Jenkinsfile to setup minimamba and create a mamba environment. -wget -O ${WORKSPACE}/miniconda.sh https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -bash miniconda.sh -b -p $WORKSPACE/miniconda_${NODE_NAME} -source $WORKSPACE/miniconda_${NODE_NAME}/etc/profile.d/conda.sh +wget -O ${WORKSPACE}/mambaforge.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" +bash mambaforge.sh -b -p $WORKSPACE/conda_${NODE_NAME} +source $WORKSPACE/conda_${NODE_NAME}/etc/profile.d/conda.sh +source $WORKSPACE/conda_${NODE_NAME}/etc/profile.d/mamba.sh -conda config --set always_yes yes --set changeps1 no -conda config --add channels conda-forge -conda config --set channel_priority strict -export PYTHONNOUSERSITE=True -conda env create --name ${CONDA_ENV_NAME}_${NODE_NAME} --file env/environment.yml -conda activate ${CONDA_ENV_NAME}_${NODE_NAME} +mamba config --set always_yes yes --set changeps1 no +mamba config --add channels conda-forge +mamba env create --name ${CONDA_ENV_NAME}_${NODE_NAME} --file env/environment.yml + +mamba activate ${CONDA_ENV_NAME}_${NODE_NAME} source env/setup-conda-env.sh -conda deactivate -rm miniconda.sh +mamba deactivate +rm mambaforge.sh diff --git a/testsuite/test.sh b/testsuite/test.sh index cf41b76..a689c6a 100755 --- a/testsuite/test.sh +++ b/testsuite/test.sh @@ -2,8 +2,10 @@ # This test script is used by the Jenkinsfile to run the iconarray tests with pytest. -source $WORKSPACE/miniconda_${NODE_NAME}/etc/profile.d/conda.sh -conda activate ${CONDA_ENV_NAME}_${NODE_NAME} +source $WORKSPACE/conda_${NODE_NAME}/etc/profile.d/conda.sh +source $WORKSPACE/conda_${NODE_NAME}/etc/profile.d/mamba.sh + +mamba activate ${CONDA_ENV_NAME}_${NODE_NAME} export PYTHONNOUSERSITE=True python -m cfgrib selfcheck python -c "import cartopy; print(cartopy.config)"