Creating a Development Environment

This describes how to setup a development environment for working on a project that uses PyGObject, or for working on PyGObject itself. Please follow the instructions on “Getting Started” first, as they are a pre-requirement.

Environment Setup

Install Dependencies

In order to compile Python and pip install pygobject, dependencies are need for your operating system.

Ubuntu / Debian

sudo apt-get install -y python3-venv python3-wheel python3-dev
sudo apt-get install -y gobject-introspection libgirepository-2.0-dev build-essential \
  libbz2-dev libreadline-dev libssl-dev zlib1g-dev libsqlite3-dev wget \
  curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libcairo2-dev

Fedora

sudo dnf install -y python3-wheel
sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel \
  sqlite sqlite-devel openssl-devel tk-devel git python3-cairo-devel \
  cairo-gobject-devel gobject-introspection-devel

Arch Linux

sudo pacman -S --noconfirm python-wheel
sudo pacman -S --noconfirm base-devel openssl zlib git gobject-introspection

openSUSE

sudo zypper install -y python3-wheel gobject-introspection-devel \
  python3-cairo-devel openssl zlib git
sudo zypper install --type pattern devel_basis

Windows

To develop on Windows you need to have MSYS2 installed.

pacman -S --needed --noconfirm base-devel mingw-w64-ucrt-x86_64-toolchain git \
   mingw-w64-ucrt-x86_64-python mingw-w64-ucrt-x86_64-pycairo \
   mingw-w64-ucrt-x86_64-gobject-introspection mingw-w64-ucrt-x86_64-libffi

macOS

With homebrew:

brew update
brew install python3 gobject-introspection libffi
export PKG_CONFIG_PATH=$(brew --prefix libffi)/lib/pkgconfig  # use /usr/local/ for older Homebrew installs

Install pyenv (Optional)

pyenv lets you easily switch between multiple versions of Python.

Linux

curl https://pyenv.run | bash
exec $SHELL
pyenv install 3.11
pyenv global 3.11

macOS

brew install pyenv
pyenv install 3.11
pyenv global 3.11

Work on PyGObject

Platform Independent Steps

First, check out the source code:

git clone https://gitlab.gnome.org/GNOME/pygobject.git
cd pygobject

With a local copy of PyGObject, there’s three ways to start developing:

  1. PDM, a modern Python package and dependency manager

  2. Pip, the default Python package installer

  3. Meson, use the Meson build system directly

PDM

Make sure you have PDM 2.13 or newer installed.

Then set up the project by running:

pdm install

You can run the unit tests with:

pdm run pytest

Pip

It’s always a good idea to work from within a Python virtual environment. PyGObject is built with Meson. In order to support editable installs, Meson-python, Meson, and Ninja should be installed in the virtual environment.

python3 -m venv .venv
source .venv/bin/activate
pip install meson-python meson ninja pycairo pytest

Note

For Python 3.12 and newer, also install setuptools, since distutils is no longer provided in the standard library.

Install PyGObject in your local environment with the --no-build-isolation to allow for dynamic rebuilds

pip install --no-build-isolation --config-settings=setup-args="-Dtests=true" -e '.[dev]'

By default the C libraries are built in “release” mode (no debug symbols). To compile the C libraries with debug symbols, run

pip install --no-build-isolation --config-settings=setup-args="-Dbuildtype=debug" --config-settings=setup-args="-Dtests=true" -e '.[dev]'

Open a Python console:

from gi.repository import GObject

Run the unittests:

pytest

Meson

It’s also possible to run the tests from Meson. Tests are still run with Pytest, so it’s important that Pytest is installed.

meson setup _build  # Needed only once
meson test -C _build