Skip to main content

A modern, pythonic interface to the Windows registry.

This project has been archived.

The maintainers of this project have marked this project as archived. No new releases are expected.

Project description

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(*parts, create=False, write=False): 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(topdown=True, onerror=None, max_depth=None): 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, default=None): read a value with fallback default
  • get_typed(name) / set_typed(name, value, type): read/write values with explicit registry type
  • value_del(name) or del key[name]: delete a value
  • delete(tree=False, missing_ok=True): delete a key (optionally recursively)
  • as_dict() / from_dict(data): export/import a subtree structure

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
    

License

MIT License. See LICENSE for details.

Changelog

See CHANGELOG.md for release history and policy.

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

winregkit-0.2.2.tar.gz (38.6 kB view details)

Uploaded Source

Built Distribution

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

winregkit-0.2.2-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file winregkit-0.2.2.tar.gz.

File metadata

  • Download URL: winregkit-0.2.2.tar.gz
  • Upload date:
  • Size: 38.6 kB
  • Tags: Source
  • Uploaded using 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}

File hashes

Hashes for winregkit-0.2.2.tar.gz
Algorithm Hash digest
SHA256 f52c843056808757f22d265ff40085b48e7e667a4855cfdbcf35f38e60805eae
MD5 364cf7580e01f42d997a034acf50c897
BLAKE2b-256 282f5042fe65475ecd96dbcfa579284ba8af1953e34dbe91a49682620638948d

See more details on using hashes here.

File details

Details for the file winregkit-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: winregkit-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 9.7 kB
  • Tags: Python 3
  • Uploaded using 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}

File hashes

Hashes for winregkit-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a5f58154ed219b5b139ef89e8104dca0844e77d84180084487ea047eecb57bf6
MD5 a1b1a3d2d5395a2eddbde0da4fa7e0a3
BLAKE2b-256 c3e66c00fb27cb6a6975d57db7e3352da02860929116c3e40f973003246386e5

See more details on using hashes here.

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