Help:Toolforge/Python

From Wikitech

Python is one of the most used programming languages on Toolforge.

For guidance on writing tools in Python, see e. g. Help:Toolforge/My first Flask OAuth tool and Help:Toolforge/My first Django OAuth tool.

The newest Python 3 based prebuilt container image is python3.11. Python is also supported when building custom images for tools, and tutorials are available..

Virtual environments with prebuilt images

When using a prebuilt image (such as python3.11) with a webservice or a job, a Python virtual environment (venv) allows the maintainers of a tool to install Python packages using pip without affecting any other tools running in Toolforge. A venv is similar to the use of composer to install PHP libraries or bundler to install ruby libraries that are local to directory rather than system wide.

A virtual environment must be created in the same execution environment that the venv will be used from. This means that any virtual enviroments must be boostrapped inside a container using toolforge webservice shell or a job.

Web services

See Toolforge webservices with Python.

Jobs

Follow these instructions if you are using the Toolforge Jobs framework.

You will need to run a one-time manual job to bootstrap a python venv from inside a job container. This is similar to the instructions about using webservice shell when bootstrapping kubernetes webservices.

Create a script similar to this to create the venv:

$HOME/bootstrap_venv.sh
#!/bin/bash

# use bash strict mode
set -euo pipefail

# delete the venv, if it already exists
rm -rf pyvenv

# create the venv
python3 -m venv pyvenv

# activate it
source pyvenv/bin/activate

# upgrade pip inside the venv and add support for the wheel package format
pip install -U pip wheel

# Change the following section depending on what your tool needs!

# install some concrete packages
# pip install requests
# pip install pyyaml

# or, install all packages from src/requirements.txt
# pip install -r src/requirements.txt

Run the bootstrapping script in the desired python container:

tools.mytool@tools-sgebastion-11:~$ ls bootstrap_venv.sh
bootstrap_venv.sh
tools.mytool@tools-sgebastion-11:~$ chmod ug+x bootstrap_venv.sh
tools.mytool@tools-sgebastion-11:~$ toolforge jobs run bootstrap-venv --command "cd $PWD && ./bootstrap_venv.sh" --image python3.11 --wait
tools.mytool@tools-sgebastion-11:~$ ls pyvenv
pyvenv

Once the venv had been created, you can run your python job as many times as needed as a manual, continuous, or periodic job:

tools.mytool@tools-sgebastion-11:~$ cat src/mytool.py
import requests
r = requests.get('https://www.wikidata.org/wiki/Q1')
print(r.status_code)
tools.mytool@tools-sgebastion-11:~$ toolforge jobs run mytool --command "pyvenv/bin/python src/mytool.py" --image python3.11
tools.mytool@tools-sgebastion-11:~$ cat mytool.out
200

Or, if you're using a shell script as the entry point for your job, use source pyvenv/bin/activate before running any other commands.

Deprecating Python 2

Many legacy tools and code examples use Python 2.x as a runtime. Use of Python 3.x is encouraged for new code as Python 2.7 stopped being maintained in 2020. Toolforge will provide some amount of support for Python 2.x through 2022 because Debian will be supporting Python 2.7 in Debian 10 (buster). This support will only extend to critical security patches however.

Elasticsearch

See Help:Toolforge/Elasticsearch#Python considerations.

See also

Communication and support

Support and administration of the WMCS resources is provided by the Wikimedia Foundation Cloud Services team and Wikimedia movement volunteers. Please reach out with questions and join the conversation:

Discuss and receive general support
Stay aware of critical changes and plans
Track work tasks and report bugs

Use a subproject of the #Cloud-Services Phabricator project to track confirmed bug reports and feature requests about the Cloud Services infrastructure itself

Read stories and WMCS blog posts

Read the Cloud Services Blog (for the broader Wikimedia movement, see the Wikimedia Technical Blog)