diff --git a/README.md b/README.md
index 458db420aa77a90777e87793981abf242cb867a5..5636442e7d09ab77e21cb0b498b7f0100701e828 100644
--- a/README.md
+++ b/README.md
@@ -94,17 +94,21 @@ Alternatively, tags can be similarly *un*assigned at individual time steps or ov
 
 ### Using the *scripts/install.sh* script
 
-On macOS and Linux, a [script](https://gitlab.pasteur.fr/nyx/larvatagger.jl/-/blob/dev/scripts/install.sh?ref_type=heads) is provided to automate the installation process from source. This script installs LarvaTagger.jl and Julia if missing. It also adds the *larvatagger* command to the user's path variable.
+On macOS, Linux and WSL, a [script](https://gitlab.pasteur.fr/nyx/larvatagger.jl/-/blob/dev/scripts/install.sh?ref_type=heads) is provided to automate the installation process from source. This script installs LarvaTagger.jl and Julia if missing. It also adds the *larvatagger* command to the user's path variable.
 The *scripts/install.sh* script can be run with:
 ```
 /bin/bash -c "$(curl -sSL "https://gitlab.pasteur.fr/nyx/larvatagger.jl/-/raw/dev/scripts/install.sh?ref_type=heads&inline=false")"
 ```
-To install the full LarvaTagger suite (Linux only!), run instead:
+To install the full LarvaTagger suite (Linux and WSL only!), run instead:
 ```
 curl -sSL "https://gitlab.pasteur.fr/nyx/larvatagger.jl/-/raw/dev/scripts/install.sh?ref_type=heads&inline=false" | /bin/bash -s -- --with-default-backend
 ```
 
-In the latter case, the script may install several extra dependencies, but not all of them. In particular, to install Python 3.8, two approaches are supported. If `pyenv` is available, the script will install Python 3.8 using `pyenv`. Otherwise, `python3.8` and `python3.8-venv` will have to be manually installed.
+In the latter case, the script may install several extra dependencies, but not all of them.
+In particular, Python is required; either 3.8 with `--with-default-backend`, or 3.11 with `--with-backend --experimental`.
+If `pyenv` is available, the script will use this tool to install Python.
+Otherwise, `python3.8` and `python3.8-venv` may have to be manually installed.
+On WSL, the script will attempt to install `pyenv` and Python (tested with Ubuntu 20.04).
 
 This script can also uninstall LarvaTagger (if installed with the same script) with: `curl -sSL "https://gitlab.pasteur.fr/nyx/larvatagger.jl/-/raw/dev/scripts/install.sh?ref_type=heads&inline=false" | /bin/bash -s -- --uninstall` which can be useful for example prior to reinstalling after failure.
 
diff --git a/scripts/install.sh b/scripts/install.sh
index 1ab7b476c5621a737366fcddb26189928ca533ef..af1f164f583f0d90ed1d8c1454c416a5ac2fd915 100755
--- a/scripts/install.sh
+++ b/scripts/install.sh
@@ -36,35 +36,35 @@ for arg in "$@"; do
   fi
 done
 
-if ! command -v curl 1>/dev/null 2>&1; then
-  if command -v brew 1>/dev/null 2>&1; then
+if ! command -v curl >/dev/null; then
+  if command -v brew >/dev/null; then
     # macOS users are not given the choice as they usually do not care about freedom
     brew install curl
   fi
 fi
-if ! command -v curl 1>/dev/null 2>&1; then
+if ! command -v curl >/dev/null; then
   echo "Command curl required; aborting"
 else
 
 check_brew() {
   if [ "`uname`" = "Darwin" ]; then
     # macOS
-    if ! command -v brew 1>/dev/null 2>&1; then
+    if ! command -v brew >/dev/null; then
       echo "Installing Homebrew; admin rights will be requested"
       /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
     fi
   fi
 }
 
-if ! command -v realpath 1>/dev/null 2>&1; then
+if ! command -v realpath >/dev/null; then
   # macOS
   check_brew
-  if command -v brew 1>/dev/null 2>&1; then
+  if command -v brew >/dev/null; then
     brew install coreutils
   fi
 fi
 
-if ! command -v julia 1>/dev/null 2>&1; then
+if ! command -v julia >/dev/null; then
   if [ -z "$JULIA_INSTALL_ARGS" ]; then
     JULIA_INSTALL_ARGS=-y
   fi
@@ -80,21 +80,37 @@ if [ -n "$WITH_BACKEND" ]; then
   if [ "`uname`" = "Darwin" ]; then
     echo "WARNING: the default tagging backend is not supported by macOS"
   fi
-  if ! command -v python$PYTHON_VERSION 1>/dev/null 2>&1; then
-    if command -v pyenv 1>/dev/null 2>&1; then
+  if ! command -v python$PYTHON_VERSION >/dev/null; then
+    if command -v pyenv >/dev/null; then
+      [ `pyenv versions | grep $PYTHON_VERSION` ] || pyenv install $PYTHON_VERSION
+    elif [[ "`uname -r`" =~ "-microsoft-standard-WSL2" ]]; then
+      echo
+      echo "INFO: installing pyenv and its dependencies"
+      echo
+      if ! [ -d ~/.pyenv ]; then
+        sudo apt-get update
+        sudo apt-get install --no-install-recommends curl build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev xz-utils libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev #tk-dev
+        curl https://pyenv.run | bash
+      fi
+      export PATH=~/.pyenv/bin:$PATH
+      eval "$(~/.pyenv/bin/pyenv init -)"
+      cat <<"EOF" >>~/.bashrc
+
+command -v pyenv >/dev/null || export PATH=~/.pyenv/bin:$PATH
+eval "$(~/.pyenv/bin/pyenv init -)"
+EOF
       pyenv install $PYTHON_VERSION
     else
       check_brew
-      if command -v brew 1>/dev/null 2>&1; then
+      if command -v brew >/dev/null; then
         brew install python@$PYTHON_VERSION
       else
         echo "WARNING: command python$PYTHON_VERSION not found"
-        echo "if under Ubuntu, consider running: sudo apt install python$PYTHON_VERSION python${PYTHON_VERSION}-venv"
       fi
     fi
   fi
-  if ! command -v poetry 1>/dev/null 2>&1; then
-    if command -v pipx 1>/dev/null 2>&1; then
+  if ! command -v poetry >/dev/null; then
+    if command -v pipx >/dev/null; then
       pipx install poetry
     else
       curl -fsSL https://install.python-poetry.org | python3 -
@@ -140,6 +156,8 @@ EOF
 else
 
 activate() {
+  # pyenv activation is necessary on WSL
+  command -v pyenv >/dev/null && pyenv local $PYTHON_VERSION
   poetry env use $PYTHON_VERSION
 }
 
@@ -179,7 +197,8 @@ else
 fi
 # setting JULIA_PROJECT may not be necessary at this point
 export JULIA_PROJECT=$(realpath TaggingBackends)
-(cd MaggotUBA && activate && (cat requirements.txt | xargs -I % sh -c 'poetry add "%"') && poetry install -v && poetry remove taggingbackends && poetry add ../TaggingBackends)
+(cd MaggotUBA && activate && (cat requirements.txt | xargs -I % sh -c 'poetry add "%"' || true) && poetry install -v)
+[ -d TaggingBackends ] && (cd MaggotUBA && activate && poetry remove taggingbackends && poetry add ../TaggingBackends)
 [ -d MaggotUBA-core ] && (cd MaggotUBA && activate && poetry remove maggotuba-core && poetry add ../MaggotUBA-core)
 (cd MaggotUBA && scripts/make_models.jl default)
 
@@ -194,7 +213,7 @@ fi
 
 chmod a+x "$BIN_DIR/larvatagger"
 
-if ! command -v larvatagger 1>/dev/null 2>&1; then
+if ! command -v larvatagger >/dev/null; then
   # ~/.local/bin not in $PATH?
   if [ "$SHELL" = "/bin/zsh" ]; then
     rcfile=~/.zshrc