Skip to main content

regkit

CI

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.

regkit 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 regkit

Or the equivalent command in your preferred package manager.

Usage

Library

from regkit 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"] = "regkit"
    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"] = "regkit"
    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(...) or create(...) and a context manager
  • Use dict-style value access (key[name], key[name] = value)
  • Use get_typed / set_typed only when explicit registry types are needed

Using registry paths

Key supports constructing and round-tripping full registry paths.

from regkit 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 it
  • open(...): return a new opened key for read/write access
  • create(*parts): shorthand for creating/opening a key for writing
  • exists(): check whether a key exists
  • walk(...): traverse a key tree, yielding (key, subkey_names, value_names) (similar to os.walk())
  • keys(), values(), items(): iterate value names, values, or (name, value) pairs
  • name: final lexical path segment for this key
  • parts: tuple of key path components, including root token when present
  • parent: lexical parent key (or None at registry root)
  • parents(): tuple of lexical ancestors from immediate parent up to root
  • get(name, ...): read a value with fallback default
  • get_typed(...) / set_typed(...): read/write values with explicit registry type
  • value_del(name) or del key[name]: delete a value
  • delete(...): 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 None as 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 regkit 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for regkit 0.3.0
File Size Uploaded
regkit-0.3.0.tar.gz 66.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for regkit 0.3.0
File Interpreter ABI Platform
regkit-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 76.4 kB

Release files / regkit-0.3.0.tar.gz

Download URL regkit-0.3.0.tar.gz
Size 66.3 kB
Tags Source
SHA-256 checksum
How to use checksums
ee46aca415b9b23ae7954d76771f14f553e07a86d520862d89adb9cae961a33c
BLAKE2b-256 checksum
How to use checksums
d3aa6cb8bfda8f9cb1bb2f0ae9ae096d8b62ff9614eed6289be0f53f31746bad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","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 / regkit-0.3.0-py3-none-any.whl

Download URL regkit-0.3.0-py3-none-any.whl
Size 10.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b21218bf3047fd43e45f27769cd9c8940a7d7a4121aac3fa2456c2bad0dce67
BLAKE2b-256 checksum
How to use checksums
525aff7eb45fba9fda348cc448cbf20be47f72cc835f50bedb11c794f71ec83f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.5 {"installer":{"name":"uv","version":"0.10.5","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 history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page