As Python gets updated older code will cease to run due to changes in Python syntax and functionality
To resolve this, we can run code in Containers but that adds a level of complexity
Another solution is to utilize pyenv and pipx and run the code in virtualized environments with the needed version of Python
Examples
Install and Run a Python App with a Specific Python Version
PrincipalMapper (pmapper) is a tool that requires Python version 3.9 to run (it errors out otherwise)
# list available versions of python to install
pyenv install --list
# install python 3.9.21
pyenv install 3.9.21
# set version of python that pyenv will use
pyenv global 3.9.21
# validate version is set (should match 3.9.21 for this example)
python --version
# install the tool, principalmapper (aka pmapper)
pipx install --python $(pyenv which python) principalmapper
Set up a Python Virtual Environment
We can set up a virtual environment to run any version of Python we want
This is useful for isolating your Python code/packages without impacting your system configuration
# install python 2.7.18
pyenv install 2.7.18
# make a directory to work in
mkdir venv-tyler-python-2-7-18
# create virtualenv for python 2.7.18
pyenv virtualenv 2.7.18 venv-tyler-python-2-7-18
# change into the directory
cd venv-tyler-python-2-7-18
# set directory for virtualenv
pyenv local venv-tyler-python-2-7-18
# validate python version (should match 2.7.18)
python --version
import json
json_dump = "./possible-subdomains.json"
with open(json_dump) as f:
data = json.load(f)
for host in data["results"]:
print(host["host"], host["url"]) # print out the host & URL
# install on linux
curl https://pyenv.run | bash
# add to ~/.zshrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc
# restart shell for PATH changes to take effect
exec "$SHELL"
# install python build dependencies (see install instructions as this is specific to your OS)
# this is for Debian-based systems (Ubuntu, Kali, Parrot, etc.)
sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
Useful commands
# view all python versions installed with pyenv
pyenv versions
# set global (default) python version for pyenv
pyenv global 3.x.x
# set local (directory) python version for pyenv (trumps global). Adds `.python-version` to directory. All pyenv commands in this directory will use this python version
pyenv local 3.x.x
# view available python versions
pyenv install --list
Pipx
Installation
pipx is a useful tool for installing and running python code and apps in isolated virtual environments