These steps explain how to set up a reproducible environment on any machine, that you can easily commit to a git repository, including the Python version and all the dependencies you add with pip, that can be used withing Visual Studio Code or a Jupyter Notebook.
If using Linux you may need to install some general utilities packages:
# You have to reinstall a Python version with PyEnv if you add any of these to be picked upsudo apt install libffi-dev # To avoid ctypes error in PyTorchsudo apt install liblzma-dev # To use lz compression in Pythonsudo apt install libbz2-dev # To use bz2 compression in Pythonsudo apt install python3-tk # To use TK GUI with Pythonsudo apt install patchelf # For nuitka Python compiler to generate Linux binariesTo install main prerequisites:
# See pipx installation instructions at: https://github.com/pypa/pipx?tab=readme-ov-file#install-pipx
# Linux## Pyenvcurl https://pyenv.run | bash### PyEnv on Fish shell:set -Ux PYENV_ROOT $HOME/.pyenvfish_add_path $PYENV_ROOT/bin## Poetrycurl -sSL https://install.python-poetry.org | python3 -
# Macosbrew install pyenvbrew install poetry
# Windows
# We recommend using WSL2 and Linux steps instead, but following are some Windows specifics
# https://www.python.org/downloads/windows/(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
# pyenv-win unnofficial forkInvoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"You can use pipx to install Python dependencies the same way you would use pip, but each installation will create its own virtual environment. So when you are required to install a system wide tool like Poetry, you know the version of its dependencies will not clash with another tool that requires different versions for some of the same dependencies.
# Example alternative installation of Poerty
pipx install poetry
You can use PyEnv to install alternative Python versions without overtaking your main Python installation. Using Poetry wouldn't help you with that.
# List all available main Python3 versionspyenv install --list | grep " 3\."
# Install a specific Python version, this can take a lot of timepyenv install -v 3.11.1
# List installed versions on directory (you can delete from there directly)ls ~ /.pyenv/versions
# Uninstall a versionpyenv uninstall -v X.X.X
# See installed, system, and active versionpyenv versions
# Activate a specific versionpyenv global 3.11.1python3 --version
# Run testspython3 -m test
# Restore original Python versionpyenv global systempython3 --versionTo use it on a project, we set a .python-version file on the root directory that automatically triggers pyenv to switch to that version when navigation to that directory.
# Specify that this directory should execute Python 3.11.1
pyenv local 3.11.1
# When navigating to the directory and back, the version automatically changes
cd ..
python3 -V
# shows main Python version
cd -
python3 -V
# shows 3.11.1
You should choose to commit the .python-version file to your project insted of ignoring it, contrary to what the default .gitignore file created by GitHub does.
Virtual Environments is the basic way of isolating Python dependencies you install with pip for a specific folder in a project, so you don't have to globally install them for the whole machine, which could cause conflict between projects that require different versions of the same library.
It lacks an importnat features to completely create a reproducible environment, because even if you use pip freeze to generate a list of your installed packages including their specific version, versions for transitive dependencies are not recorded (those packages that are pedendencies from the ones you installed). So when you later reinstall the packages you may end up with difference source for those transitive dependencies.
That's why we encoure you to use Poetry to manage both virtual environments and track dependencies.
Anyways here are the basics on how to use virtual environments. Make sure you activate the right Python version with pyenv before you create the virtual environment, so it's included in it:
# Update pip
pip install --upgrade pip
# On Windows:# python -m pip install --upgrade pip# Install virtualenv in your machine
pip install --upgrade virtualenv
# Change to your desired project directorycd project
# Create an environment directory "env"
python3 -m venv env
# Activate it with bashsource env/bin/activate
# Activate it with fish. ./env/bin/activate.fish
# Activate it on Windows:# env\Scripts\activate# Install your custom pip dependencies
...
# Exit the environmentexitMake sure you specify and activate a specific Python version using pyenv as explaining at the beginning of this document.
In the parent directory where you want your project, execute:
poetry new --name mypackage --src mydirectoryThis will create this structure:
- mydirectory
- src
- mypackage
- src
See more information here and here.
Edit mydirectory/pyproject.toml and among other things, change python = "^3.9" to specify the version of Python you want to use (at the moment of writting this, many Debian installations tops at Python 3.9 and not 3.10+).
To configure Poetry to run using the PyEnv configured Python version for this project, execute:
poetry config virtualenvs.prefer-active-python true --localIf executing poetry run pytest you get an error, Poetry defiend the wrong version of pytest. Open pyproject.toml and substitute pytest = "^5.2" with, e.g., pytest = "^6.0", and execute:
poetry add --dev pytest-xdistMore info here
If you want to download and install already defined dependencies, for example, if you just cloned this repository, use:
poetry installTo add jupyterlab as a dependency
poetry add jupyterlabPoetry will create a new virtual environment, include there the Python version of the project and other dependencies in it, as well as the jupyterlab package.
poetry updatepoetry shellAfterwards you can launch from it Visual Studio Code and use it to debug the same Python version your code is executing as.
poetry run python3 Add some dependencies for development, flake8 for linting, mypy for static typing, black for formatting.
poetry add -D flake8 mypy blackRun VSCode in Poetry's virtual environment with access to all installed dependencies
poetry run code .## or
poetry shell
code .Click on the bottom right corner of VSCode where it says "Python", and select the virtual environment that has your project name in it, including "Poetry" to its right.
More information here:
- https://www.pythoncheatsheet.org/blog/python-projects-with-poetry-and-vscode-part-1
- https://www.pythoncheatsheet.org/blog/python-projects-with-poetry-and-vscode-part-2
- https://py-vscode.readthedocs.io/en/latest/files/linting.html
Read this: https://click.palletsprojects.com/en/7.x/setuptools/#setuptools-integrationhttps://www.youtube.com/watch?v=kNke39OZ2k0
Set up the project for pip on setup.py file.
Load the virtual environment and load the project in pip as editable, it will sync code changes:
cd starter
. venv/bin/activate
pip --editable .# Test execution
holaYou can now modify files under ./starter and each execution of hola will use latest code.
Read this:
poetry add clickRead this:
poetry add mamba# Add all dependencies the first time
poetry add jupyterlab
# Or download them if you cloned this repo
poetry install
# Launch Jupyter Lab locally
poetry run jupyter-labYour browser will launch the url http://localhost:8888/lab
Save the .ipynb file and add it to a GitHub repository. When browsing the repo, it will expose it with its web interface.
The last run of the calculation will be shown in it, even if the source data is not available.
You can add additional dependencies, like:
poetry add numpy
poetry add matplotlib
poetry add tabulateYou can use VSCode to edit the Jupyter Notebook directly without having to start the server, and using the same Python environment and dependencies managed using Poetry.
First, start Poetry virtual environment, and launch VSCode from there.
poetry shell
code .Open the .pyjnb file on VSCode. Then on the top right of the VSCode window, you will see a mention of the Python version running. Click on it, and on the dropdown select the virtual environment with the Python version created using Poetry. Any dependencies that you install with Poetry will be available from within VSCode.