Manage Python versions in non-Python containers
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.
- Add your target Python version as a variable:
.upsun/config.yaml
applications:
# The app's name, which must be unique within the project.
app:
type: 'php:8.3'
variables:
env:
# Update for your desired Python version.
PYTHON_VERSION: "3.11.0"- Add Pyenv in a
buildhook:
.upsun/config.yaml
applications:
# The app's name, which must be unique within the project.
app:
type: 'php:8.3'
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:
- 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.
app:
type: 'php:8.3'
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 -
Create an
.environmentfile:touch .environment -
Update the PATH for the runtime environment:
.environmentexport PATH=/app/.pyenv/bin:/app/.pyenv/shims:$PATH
Now the specified Python version is used in the runtime environment.