Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

winregkit

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.

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(...) 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 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 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 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)

Source distribution for winregkit 0.2.3
File Size Uploaded
winregkit-0.2.3.tar.gz 66.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for winregkit 0.2.3
File Interpreter ABI Platform
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}
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