[ANN] regobj - Pythonic object-based access to the Windows Registry

Ryan Kelly ryan at rfk.id.au
Sun May 3 16:35:08 CEST 2009


Hi All,

  I've just released the results of a nice Sunday's coding, inspired by
one too many turns at futzing around with the _winreg module.  The
"regobj" module brings a convenient and clean object-based API for
accessing the Windows Registry.

    http://pypi.python.org/pypi/regobj/

  More details and some API examples below for those who are interested.

  Cheers,

      Ryan

"""

  regobj:  Pythonic object-based access to the Windows Registry

  License:  BSD
  Current Release:  0.1.0

This module provides a thin wrapper around the standard _winreg module,
allowing easier and more pythonic access to the Windows Registry. All
access to the registry is done through Key objects, which (surprise!)
represent a specific registry key.

Starting from pre-defined root keys, all subkey access is done using
standard attribute syntax:

  >>> HKCU.Software.Microsoft.Windows
  <regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows'>
  >>> HKCU.Software.MyTests
  Traceback (most recent call last):
      ...
  AttributeError: subkey 'MyTests' does not exist
  >>> HKCU.Software.MyTests = Key
  >>> HKCU.Software.MyTests
  <regobj Key 'HKEY_CURRENT_USER\Software\MyTests'>
  >>> del HKCU.Software.MyTests

Of course, for keys that don't happen to be named like python
identifiers, there are also methods that can accomplish the same thing.

The individual values contained in a key can be accessed using standard
item access syntax.  The returned objects will be instances of the Value
class, with 'name', 'type' and 'data' attributes:

  >>> HKCU.Software.Microsoft.Clock["iFormat"]
  <regobj Value (iFormat,1,REG_SZ)>
  >>> HKCU.Software.Microsoft.Clock["iFormat"].name
  'iFormat'
  >>> HKCU.Software.Microsoft.Clock["iFormat"].data
  u'1'
  >>> HKCU.Software.Microsoft.Clock["iFormat"].type
  1
  >>> HKCU.Software.Microsoft.Clock["notavalue"]
  Traceback (most recent call last):
      ...
  KeyError: "no such value: 'notavalue'"
 
Iterating over a key generates all the contained values, followed by
all the contained subkeys.  There are also methods to separately iterate
over just the values, or just the subkeys:

  >>> winK = HKCU.Software.Microsoft.Windows
  >>> winK["testvalue"] = 42
  >>> for obj in winK:
  ...   print obj
  <regobj Value (testvalue,42,REG_DWORD)>
  <regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion'>
  <regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell'>
  <regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam'>
  >>> [k.name for k in winK.subkeys()]
  ['CurrentVersion', 'Shell', 'ShellNoRoam']
  >>> [v.data for v in winK.values()]
  [42]

These iterators also provide efficient implementations of the
__contains__ and __len__ methods.

Finally, there is powerful support for specifying key and value
structures at creation time.  The simplest case has already been
demonstrated, where setting a subkey to the Key class or to None will
create it without any data:

  >>> HKCU.Software.MyTests = None
  >>> len(HKCU.Software.MyTests)
  0

If a subkey is assigned an existing key object, the data from that key
is copied into the subkey:

  >>> HKCU.Software.MyTests = HKCU.Software.Microsoft.Windows
  >>> [k.name for k in HKCU.Software.MyTests]
  ['CurrentVersion', 'Shell', 'ShellNoRoam']

If a subkey is assigned a dictionary, the structure of that dictionary
is copied into the subkey.  Scalar values become key values, while
nested  dictionaries create subkeys:

  >>> HKCU.Software.MyTests = {"val1":7, "stuff":{"a":1,"c":2,"e":3}}
  >>> [v.name for v in HKCU.Software.MyTests.values()]
  ['val1']
  >>> [k.name for k in HKCU.Software.MyTests.subkeys()]
  ['stuff']
  >>> len(HKCU.Software.MyTests.stuff)
  3

Any other value assigned to a subkey will become the default value for
that key (i.e. the value with name ""):

  >>> HKCU.Software.MyTests = "dead parrot"
  >>> HKCU.Software.MyTests[""].data
  u'dead parrot'
 
And that's that - enjoy!
"""


-- 
Ryan Kelly
http://www.rfk.id.au  |  This message is digitally signed. Please visit
ryan at rfk.id.au        |  http://www.rfk.id.au/ramblings/gpg/ for details

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
URL: <http://mail.python.org/pipermail/python-announce-list/attachments/20090504/101eb6cc/attachment.pgp>


More information about the Python-announce-list mailing list