Platform.sh is now Upsun. Click here to learn more
Upsun User Documentation

Manage Python versions in non-Python containers

Try Upsun for 15 days
After that, enjoy the same game-changing Upsun features for less with the First Project Incentive!¹ A monthly $19 perk!
Activate your 15-day trial
¹Terms and conditions apply

You may need to use a specific version of Python that isn’t available in an app container for a different language. For example, a container might have a long-term support version, while you want the latest version.

In such cases, use the Pyenv version manager to install the specific version you want to use.

  1. Add your target Python version as a variable:
.upsun/config.yaml
applications:  # The app's name, which must be unique within the project.  myapp:  type: 'php:8.4'  variables:  env:  # Update for your desired Python version.  PYTHON_VERSION: "3.11.0"
  1. Add Pyenv in a build hook:
.upsun/config.yaml
applications:  # The app's name, which must be unique within the project.  myapp:  type: 'php:8.4'  variables:  env:  # Update for your desired Python version.  PYTHON_VERSION: "3.11.0"  hooks:  build: |  # Exit the hook on any failure  set -e   # Clone Pyenv to the build cache if not present  if [ ! -d "$PLATFORM_CACHE_DIR/.pyenv" ]; then  mkdir -p $PLATFORM_CACHE_DIR/.pyenv  git clone https://github.com/pyenv/pyenv.git $PLATFORM_CACHE_DIR/.pyenv  fi   # Pyenv environment variables  export PYENV_ROOT="$PLATFORM_CACHE_DIR/.pyenv"  export PATH="$PYENV_ROOT/bin:$PATH"   # Initialize Pyenv  if command -v pyenv 1>/dev/null 2>&1; then  eval "$(pyenv init --path)"  fi   # Install desired Python version  mkdir -p $PLATFORM_CACHE_DIR/.pyenv/versions  if [ ! -d "$PLATFORM_CACHE_DIR/.pyenv/versions/$PYTHON_VERSION" ]; then  pyenv install $PYTHON_VERSION  fi   # Set global Python version  pyenv global $PYTHON_VERSION 

Now your build hook can use the specified version of Python. You can verify this by running python --version.

If you want this Python version to be available in the runtime environment, follow these steps:

  1. Copy Pyenv to your runtime environment at the end of your build hook:
.upsun/config.yaml
applications:  # The app's name, which must be unique within the project.  myapp:  type: 'php:8.4'  hooks:  build: |  ...   # Copy Pyenv directory to runtime directory  cp -R $PLATFORM_CACHE_DIR/.pyenv $PLATFORM_APP_DIR   # Rehash Pyenv for new (runtime) location  PYENV_ROOT="$PLATFORM_APP_DIR/.pyenv" $PLATFORM_APP_DIR/.pyenv/bin/pyenv rehash 
  1. Create an .environment file:

    touch .environment
  2. Update the PATH for the runtime environment:

    .environment
    export PATH=/app/.pyenv/bin:/app/.pyenv/shims:$PATH

Now the specified Python version is used in the runtime environment.