This project has been archived by its maintainers, and is no longer receiving any updates.
winregkit
A modern, pythonic interface to the Windows registry.
Introduction
Python comes with winreg for registry operations, but it is a thin wrapper over
Win32 APIs and can be cumbersome for day-to-day usage.
winregkit provides a higher-level, object-oriented interface with simple tree
navigation, dict-like value access, and context-manager support.
Features
- Easy-to-use API for reading and writing Windows Registry keys
- Python 3.11+
- Windows platform
- MIT License
- Managed and built with uv
Installation
pip install winregkit
Or the equivalent command in your preferred package manager.
Usage
Library
from winregkit import current_user
import winreg
# open for read
with current_user.subkey("Software", "MyApp").open() as key:
print(key["name"])
print(key.get("missing", "default"))
# open for write (subkeys can be passed directly to open as a convenience)
with current_user.open("Software", "MyApp", write=True) as key:
key["name"] = "winregkit"
key["enabled"] = 1
# pathlib-style path concatenation is also supported via "/"
with (current_user / "Software" / "MyApp").open(write=True) as key:
key["theme"] = "dark"
# create/open for write (create is shorthand for open(create=True, write=True))
with current_user.create("Software", "MyApp") as key:
key["name"] = "winregkit"
key["enabled"] = 1
# the Key object provides dict access and values can be iterated over:
with current_user.open("Software", "MyApp") as key:
for name, value in key.items():
print(name, value)
# the underlying type of a value can be retrieved, and a custom type can be
# set, overriding default conversions:
with current_user.open("Software", "MyApp", write=True) as key:
value, value_type = key.get_typed("enabled")
print(value, value_type)
key.set_typed("payload", b"\x00\x01\x02", winreg.REG_BINARY)
# existence checks are available on keys:
app_key = current_user.subkey("Software", "MyApp")
print(app_key.exists())
subkey(...) is optional convenience for pre-building a path. You can either
chain with subkey(...) first, or pass subkeys directly to open(...) / create(...).
Typical workflow
- Use root factories (
current_user,local_machine, etc.) - Navigate with
subkey(...)(optional) - Open with
open(...)orcreate(...)and a context manager - Use dict-style value access (
key[name],key[name] = value) - Use
get_typed/set_typedonly when explicit registry types are needed
Using registry paths
Key supports constructing and round-tripping full registry paths.
from winregkit import Key
# Construct from explicit path parts
key = Key.from_parts(("HKCU", "Software", "MyApp"))
# Construct from a full path string (either HKCU or HKEY_CURRENT_USER style)
same_key = Key.from_path(r"HKEY_CURRENT_USER\Software\MyApp")
# Read parts back (root token + subkey parts)
assert key.parts == ("HKCU", "Software", "MyApp")
# name is the final lexical segment
assert key.name == "MyApp"
# parents() returns lexical ancestors from nearest parent upward
assert [ancestor.name for ancestor in key.parents()] == ["Software", "HKCU"]
Use from_parts(...) when you already have tokenized components, and
from_path(...) when parsing user-provided registry path strings.
Key methods at a glance
subkey(*parts): build a child key path without opening itopen(...): return a new opened key for read/write accesscreate(*parts): shorthand for creating/opening a key for writingexists(): check whether a key existswalk(...): traverse a key tree, yielding(key, subkey_names, value_names)(similar toos.walk())keys(),values(),items(): iterate value names, values, or(name, value)pairsname: final lexical path segment for this keyparts: tuple of key path components, including root token when presentparent: lexical parent key (orNoneat registry root)parents(): tuple of lexical ancestors from immediate parent up to rootget(name, ...): read a value with fallback defaultget_typed(...)/set_typed(...): read/write values with explicit registry typevalue_del(name)ordel key[name]: delete a valuedelete(...): delete a key (optionally recursively)as_dict()/from_dict(data): export/import a subtree structure
Default value name
The registry's default (unnamed) value is represented by the empty string ("").
- Iteration methods (
items(),items_typed(),keys()) return""for the default value name. - Set/delete helpers also accept
Noneas an equivalent.
Development
This project uses the uv package manager.
-
Install uv, e.g. using
pip install uv -
Install dev dependencies:
uv sync --dev
-
Run tests:
uv run pytest
-
Build docs:
uv sync --group docs uv run mkdocs build --strict
License
MIT License. See LICENSE for details.
Changelog
See CHANGELOG.md for release history and policy.
Metadata
Release files for winregkit 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| winregkit-0.2.3.tar.gz | 66.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| winregkit-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 76.2 kB
Release files / winregkit-0.2.3.tar.gz
| Download URL | winregkit-0.2.3.tar.gz |
|---|---|
| Size | 66.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
61e36a1715e1b53734e85729c6634bf4f92c380f2f3f7aa13fa9f98596fd6851
|
|
BLAKE2b-256 checksum How to use checksums |
577acf0d9839e7b75ed00b0cd6a2cc6d92c1455bb5bfb5ce4be541fe9aaa3bb1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / winregkit-0.2.3-py3-none-any.whl
| Download URL | winregkit-0.2.3-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f18b146cc3b09632c0a091d70408980f034ae6ae597f78f56e12ccb020920288
|
|
BLAKE2b-256 checksum How to use checksums |
42d195cc78f923dddd3b8dc15a891106b6f93bc75acb9f0583f11bf818819d4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|