← Back to all sparks
P

pyproj

DEVOPS
Velocity0.0

Python interface to cartographic projections

pyproj is quietly preparing for a Python without the GIL

geospatialpythonfree-threadingprojpackaging
Current state
The package tracks PROJ closely - each release bumps the bundled library and raises the minimum supported version - while the interesting work happens around threading and distribution. 3.7.0 dropped the GIL during long-running PROJ database calls and introduced a thread-local context; 3.7.2 enabled free-threading compatibility and shipped free-threaded 3.13 wheels alongside new win_arm64 builds.
Where it's heading
Two years of releases point the same way: making a C-library binding safe and fast to call from many threads at once, then shipping it everywhere. The wheel matrix keeps widening - musllinux, Windows on ARM, free-threaded builds - which for a package most users install as a transitive geospatial dependency matters more than any individual API addition.
Prediction
Expect free-threading support to move from compatible to tested as the wider ecosystem catches up, and the minimum PROJ version to keep advancing on its established schedule. API additions will likely stay small and CRS-focused.

Recent moves

  1. 0y ago

    Free-threading compatibility and Windows ARM64 wheels

    Enables free-threading compatibility and ships free-threaded 3.13 wheels, adds Windows on ARM builds, and raises the floor to PROJ 9.4 and Python 3.11. The build and threading story, not the API, is what moved here.

    View source ↗
  2. 1y ago

    musllinux wheels added; bundled PROJ moves to 9.5.1

    Adds musllinux wheels, updates the bundled PROJ to 9.5.1 and moves the macOS deployment target to 13. Distribution breadth plus Cython 3.1 compatibility fixes.

    View source ↗
  3. 1y ago

    GIL released during PROJ database calls; thread-local context

    The threading groundwork: the GIL is released during long-running PROJ database calls and contexts become thread-local. CRS also gains is_deprecated and get_non_deprecated(), useful when working with superseded coordinate definitions.

    View source ↗
  4. 2y ago

    Python 3.12 support and Cython 3 compatibility

    Adds Python 3.12 support, updates to PROJ 9.3 and fixes Cython 3 compatibility, with the rest documentation corrections. Routine upkeep against moving dependencies.

    View source ↗
  5. 3y ago

    CRS.to_2d() and superseded transformer options

    A small API release: CRS.to_2d() for dropping the vertical axis, an allow_superseded option on TransformerGroup, and an output_axis_rule parameter for to_wkt. Also raises the minimum Python to 3.9.

    View source ↗