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
libpostalshared 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 allctypesstructs exactly as defined inlibpostal.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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca0414b57f19129c042681aa7221d1a39e9dd1e96567e79276cd98147595af30
|
|
| MD5 |
d9fab09002e4d5d0262a3c5f61804503
|
|
| BLAKE2b-256 |
6d8096cbeec426428eea6231a984c3ecbbe5003138ae1369b4ca1976ebf83383
|
Provenance
The following attestation bundles were made for postalkit-1.0.0.tar.gz:
Publisher:
publish-pypi.yml on jayeshmepani/libpostal-ffi-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
postalkit-1.0.0.tar.gz -
Subject digest:
ca0414b57f19129c042681aa7221d1a39e9dd1e96567e79276cd98147595af30 - Sigstore transparency entry: 1367564943
- Sigstore integration time:
-
Permalink:
jayeshmepani/libpostal-ffi-python@7cbb9a2dd90de1cf1d228fc1c8556a4728d43d15 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jayeshmepani
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7cbb9a2dd90de1cf1d228fc1c8556a4728d43d15 -
Trigger Event:
workflow_dispatch
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e81079d96df558e7f4d5a8d40d151d486d7fca6538c9a3a87eec9dbe0f72f622
|
|
| MD5 |
756b827b01d40da80119c9c3d53dec76
|
|
| BLAKE2b-256 |
6fd906cb8a199421ddacc1478395e8820af57cb1e1f7f5a68f2ec08835a748d7
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
postalkit-1.0.0-py3-none-any.whl -
Subject digest:
e81079d96df558e7f4d5a8d40d151d486d7fca6538c9a3a87eec9dbe0f72f622 - Sigstore transparency entry: 1367564956
- Sigstore integration time:
-
Permalink:
jayeshmepani/libpostal-ffi-python@7cbb9a2dd90de1cf1d228fc1c8556a4728d43d15 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jayeshmepani
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7cbb9a2dd90de1cf1d228fc1c8556a4728d43d15 -
Trigger Event:
workflow_dispatch
-
Statement type: