Skip to main content

Zero-setup, one-command install Python package for libpostal

Project description

PostalKit

Zero-setup, one-command install Python package for libpostal. Designed as a strict 1:1 C-FFI wrapper.

Parsing international street addresses shouldn't require a Ph.D. in C compilation. postalkit provides the ultimate zero-friction environment to run the amazing libpostal C library natively in Python, without abstracting away its raw power.

Like FFI implementations in PHP, this exposes the exact C structs, constants, and functions so that you can port C logic directly to Python.

✨ Why PostalKit?

The standard postal package requires you to manually compile C code, install autoconf, make, pkg-config, and manually download a ~2GB machine learning model.

PostalKit handles everything automatically:

  • Zero C compilation: Downloads pre-compiled libpostal shared binaries for your OS and architecture.
  • Auto-downloads models: Fetches the required libpostal ML models transparently on first use.
  • Strict 1:1 C Mapping: Exposes libpostal_parse_address, libpostal_expand_address, and all ctypes structs exactly as defined in libpostal.h.
  • Cross-platform: Works on Linux (x86_64, arm64), macOS (Intel, Apple Silicon), and Windows.

📦 Installation

pip install postalkit

🚀 Quickstart

Because this is a true 1:1 FFI wrapper, you use the exact function names and C-structs defined in the upstream libpostal C headers. Memory is managed precisely as it is in C.

import ctypes
import postalkit

# 1. Get the C-struct for parser options
options = postalkit.libpostal_get_address_parser_default_options()

# 2. Call the C-function directly (strings must be passed as bytes)
address = b"221B Baker St London"
response_ptr = postalkit.libpostal_parse_address(address, options)

# 3. Access the raw C-arrays
response = response_ptr.contents
for i in range(response.num_components):
    component = response.components[i].decode('utf-8')
    label = response.labels[i].decode('utf-8')
    print(f"{label}: {component}")

# 4. Manually destroy the C pointer to free memory, exactly as in C!
postalkit.libpostal_address_parser_response_destroy(response_ptr)

🧠 True 1:1 FFI Coverage

This package leaves absolutely nothing behind. It natively exposes:

  • All 46 C functions (libpostal_tokenize, libpostal_classify_language, libpostal_is_name_duplicate_fuzzy, etc.)
  • All 10 C Structs (libpostal_normalize_options_t, libpostal_duplicate_options_t, etc.)
  • All 42 C Constants & Bitwise Flags (LIBPOSTAL_ADDRESS_HOUSE_NUMBER, LIBPOSTAL_NORMALIZE_TOKEN_DELETE_HYPHENS, etc.)

You can directly port any libpostal C/C++ tutorial code into Python line-by-line.

🛠️ Advanced Usage

Pre-downloading assets (e.g., for Docker images or CI):

from postalkit.data.manager import ensure_all_assets
ensure_all_assets()

📄 License

MIT License. Developed with 💙 by Jayesh Mepani.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

postalkit-1.0.0.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

postalkit-1.0.0-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

File details

Details for the file postalkit-1.0.0.tar.gz.

File metadata

  • Download URL: postalkit-1.0.0.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for postalkit-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ca0414b57f19129c042681aa7221d1a39e9dd1e96567e79276cd98147595af30
MD5 d9fab09002e4d5d0262a3c5f61804503
BLAKE2b-256 6d8096cbeec426428eea6231a984c3ecbbe5003138ae1369b4ca1976ebf83383

See more details on using hashes here.

Provenance

The following attestation bundles were made for postalkit-1.0.0.tar.gz:

Publisher: publish-pypi.yml on jayeshmepani/libpostal-ffi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file postalkit-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: postalkit-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 13.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for postalkit-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e81079d96df558e7f4d5a8d40d151d486d7fca6538c9a3a87eec9dbe0f72f622
MD5 756b827b01d40da80119c9c3d53dec76
BLAKE2b-256 6fd906cb8a199421ddacc1478395e8820af57cb1e1f7f5a68f2ec08835a748d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for postalkit-1.0.0-py3-none-any.whl:

Publisher: publish-pypi.yml on jayeshmepani/libpostal-ffi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page