User Documentation

Manage Python versions in non-Python containers

Sign up for Upsun

Get your free trial by clicking the link below.

Get your Upsun free trial

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:
            # Update for your desired Python version.
            PYTHON_VERSION: "3.11.0"
  1. Add Pyenv in a build hook:
        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 $PLATFORM_CACHE_DIR/.pyenv

            # 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)"

            # 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

            # 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:
        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:

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

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

Is this page helpful?