Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
e9956c49
Commit
e9956c49
authored
Jul 21, 2000
by
Paul Prescod
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added docstrings
parent
4547bea3
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
71 additions
and
5 deletions
+71
-5
Lib/plat-win/winreg.py
Lib/plat-win/winreg.py
+71
-5
No files found.
Lib/plat-win/winreg.py
View file @
e9956c49
"""
Windows registry support.
openKey( keyname )
open existing key object
>>> key=openKey( r"HKLM
\
HARDWARE
\
DESCRIPTION
\
Sys
t
em" )
createKey( keyname )
create a key if it doesn't already exist
>>> key=createKey( r"HKLM
\
SOFTWARE
\
Python
\
Tes
t
" )
deleteKey( keyname )
delete a key if it exists
Note: deleteKey may not be recursive on all platforms.
>>> key=createKey( r"HKLM
\
SOFTWARE
\
Python
\
Tes
t
" )
RemoteKey( machine, top_level_key ):
open a key on another machine.
You can use the returned key as a basis for opens, creates and deletes
on the other machine.
>>> key=RemoteKey( "somemachine", "HKLM" )
For information on the key API, open a key and look at its docstring.
"""
import
_winreg
import
_winreg
import
sys
import
sys
import
exceptions
import
exceptions
...
@@ -6,12 +37,14 @@ from types import *
...
@@ -6,12 +37,14 @@ from types import *
import
string
import
string
class
RegType
:
class
RegType
:
"Represents one of the types that can go into the registry"
def
__init__
(
self
,
msname
,
friendlyname
):
def
__init__
(
self
,
msname
,
friendlyname
):
self
.
msname
=
msname
self
.
msname
=
msname
self
.
friendlyname
=
friendlyname
self
.
friendlyname
=
friendlyname
self
.
intval
=
getattr
(
_winreg
,
msname
)
self
.
intval
=
getattr
(
_winreg
,
msname
)
def
__repr__
(
self
):
def
__repr__
(
self
):
"Return a useful representation of the type object"
return
"<RegType %d: %s %s>"
%
\
return
"<RegType %d: %s %s>"
%
\
(
self
.
intval
,
self
.
msname
,
self
.
friendlyname
)
(
self
.
intval
,
self
.
msname
,
self
.
friendlyname
)
...
@@ -49,20 +82,24 @@ for constant in _typeConstants.values():
...
@@ -49,20 +82,24 @@ for constant in _typeConstants.values():
regtypes
[
constant
.
msname
]
=
constant
regtypes
[
constant
.
msname
]
=
constant
class
_DictBase
:
class
_DictBase
:
"Base class for dictionary-type objects"
def
__init__
(
self
,
key
):
def
__init__
(
self
,
key
):
self
.
key
=
key
self
.
key
=
key
def
clear
(
self
):
def
clear
(
self
):
"Clear the list of keys/data values, as in dictionaries"
keys
=
list
(
self
.
keys
()
)
keys
=
list
(
self
.
keys
()
)
map
(
self
.
__delitem__
,
keys
)
map
(
self
.
__delitem__
,
keys
)
def
get
(
self
,
item
,
defaultVal
=
None
):
def
get
(
self
,
item
,
defaultVal
=
None
):
"Get a key/value by name or index"
try
:
try
:
return
self
.
__getitem__
(
item
)
return
self
.
__getitem__
(
item
)
except
(
IndexError
,
EnvironmentError
,
WindowsError
):
except
(
IndexError
,
EnvironmentError
,
WindowsError
):
return
defaultVal
return
defaultVal
def
has_key
(
self
,
item
):
def
has_key
(
self
,
item
):
"Check if a key/data value with a particular name exists"
try
:
try
:
self
.
__getitem__
(
item
)
self
.
__getitem__
(
item
)
return
1
return
1
...
@@ -70,6 +107,7 @@ class _DictBase:
...
@@ -70,6 +107,7 @@ class _DictBase:
return
0
return
0
def
keys
(
self
):
def
keys
(
self
):
"Get a list of key/data value names"
keys
=
[]
keys
=
[]
try
:
try
:
for
i
in
xrange
(
0
,
sys
.
maxint
):
for
i
in
xrange
(
0
,
sys
.
maxint
):
...
@@ -80,18 +118,21 @@ class _DictBase:
...
@@ -80,18 +118,21 @@ class _DictBase:
return
keys
return
keys
def
values
(
self
):
def
values
(
self
):
"Get a list of key objects or data values"
values
=
[]
# map() doesn't use the IndexError semantics...
values
=
[]
# map() doesn't use the IndexError semantics...
for
i
in
self
:
for
i
in
self
:
values
.
append
(
i
)
values
.
append
(
i
)
return
values
return
values
def
items
(
self
):
def
items
(
self
):
"Get pairs of keyname/key object or valuename/value data"
return
map
(
None
,
self
.
keys
(),
self
.
values
()
)
return
map
(
None
,
self
.
keys
(),
self
.
values
()
)
def
__len__
(
self
):
def
__len__
(
self
):
return
len
(
self
.
keys
()
)
return
len
(
self
.
keys
()
)
def
_getName
(
item
,
nameFromNum
):
def
_getName
(
item
,
nameFromNum
):
"Helper function -- don't use it directly"
if
type
(
item
)
==
IntType
:
if
type
(
item
)
==
IntType
:
try
:
try
:
keyname
=
nameFromNum
(
item
)
keyname
=
nameFromNum
(
item
)
...
@@ -107,6 +148,7 @@ def _getName( item, nameFromNum ):
...
@@ -107,6 +148,7 @@ def _getName( item, nameFromNum ):
class
RegValuesDict
(
_DictBase
):
class
RegValuesDict
(
_DictBase
):
"A dictionary of registry data values"
def
_nameFromNum
(
self
,
i
):
def
_nameFromNum
(
self
,
i
):
return
self
.
key
.
_nameFromNum
(
i
)
return
self
.
key
.
_nameFromNum
(
i
)
...
@@ -124,9 +166,9 @@ class RegValuesDict( _DictBase ):
...
@@ -124,9 +166,9 @@ class RegValuesDict( _DictBase ):
def
__delitem__
(
self
,
item
):
def
__delitem__
(
self
,
item
):
valname
=
_getName
(
item
,
self
.
_nameFromNum
)
valname
=
_getName
(
item
,
self
.
_nameFromNum
)
self
.
key
.
deleteValue
(
valname
)
self
.
key
.
deleteValue
(
valname
)
class
RegKeysDict
(
_DictBase
):
class
RegKeysDict
(
_DictBase
):
"A dictionary of registry keys"
def
_nameFromNum
(
self
,
item
):
def
_nameFromNum
(
self
,
item
):
return
_winreg
.
EnumKey
(
self
.
key
.
handle
,
item
)
return
_winreg
.
EnumKey
(
self
.
key
.
handle
,
item
)
...
@@ -139,6 +181,7 @@ class RegKeysDict( _DictBase ):
...
@@ -139,6 +181,7 @@ class RegKeysDict( _DictBase ):
self
.
key
.
deleteSubkey
(
keyname
)
self
.
key
.
deleteSubkey
(
keyname
)
def
openKey
(
keyname
,
samFlags
=
None
):
def
openKey
(
keyname
,
samFlags
=
None
):
"Open a key by name"
lst
=
string
.
split
(
keyname
,
"
\
\
"
,
1
)
lst
=
string
.
split
(
keyname
,
"
\
\
"
,
1
)
if
len
(
lst
)
==
2
:
if
len
(
lst
)
==
2
:
hivename
,
path
=
lst
hivename
,
path
=
lst
...
@@ -161,49 +204,61 @@ def deleteKey( keyname ):
...
@@ -161,49 +204,61 @@ def deleteKey( keyname ):
class
RegKey
:
class
RegKey
:
"A registry key object"
def
__init__
(
self
,
name
,
handle
=
None
):
self
.
name
=
name
self
.
handle
=
handle
def
_nameFromNum
(
self
,
item
):
def
_nameFromNum
(
self
,
item
):
"internal"
(
name
,
data
,
datatype
)
=
_winreg
.
EnumValue
(
self
.
handle
,
item
)
(
name
,
data
,
datatype
)
=
_winreg
.
EnumValue
(
self
.
handle
,
item
)
return
name
return
name
def
__nonzero__
(
self
):
def
__nonzero__
(
self
):
"Is the key open?"
if
self
.
handle
:
if
self
.
handle
:
return
1
return
1
else
:
else
:
return
0
return
0
def
__cmp__
(
self
,
other
):
def
__cmp__
(
self
,
other
):
"Compare two keys for equality"
if
hasattr
(
other
,
"handle"
)
and
hasattr
(
other
,
"name"
):
if
hasattr
(
other
,
"handle"
)
and
hasattr
(
other
,
"name"
):
return
cmp
(
self
.
name
,
other
.
name
)
return
cmp
(
self
.
name
,
other
.
name
)
else
:
else
:
return
cmp
(
self
.
handle
,
other
)
return
cmp
(
self
.
handle
,
other
)
def
__init__
(
self
,
name
,
handle
=
None
):
self
.
name
=
name
self
.
handle
=
handle
def
__repr__
(
self
):
def
__repr__
(
self
):
return
"<Windows RegKey: %s>"
%
self
.
name
return
"<Windows RegKey: %s>"
%
self
.
name
def
close
(
self
):
def
close
(
self
):
"Close the key"
return
_winreg
.
CloseKey
(
self
.
handle
)
return
_winreg
.
CloseKey
(
self
.
handle
)
def
getSubkeyNames
(
self
):
def
getSubkeyNames
(
self
):
"Get a list of subkey names"
return
self
.
getSubkeys
().
keys
()
return
self
.
getSubkeys
().
keys
()
def
getValueNames
(
self
):
def
getValueNames
(
self
):
"Get a list of value names"
return
self
.
getValues
().
keys
()
return
self
.
getValues
().
keys
()
def
deleteSubkey
(
self
,
subkey
):
def
deleteSubkey
(
self
,
subkey
):
"Delete a subkey by name"
return
_winreg
.
DeleteKey
(
self
.
handle
,
subkey
)
return
_winreg
.
DeleteKey
(
self
.
handle
,
subkey
)
def
deleteValue
(
self
,
valname
):
def
deleteValue
(
self
,
valname
):
"Delete a value by name"
return
_winreg
.
DeleteValue
(
self
.
handle
,
valname
)
return
_winreg
.
DeleteValue
(
self
.
handle
,
valname
)
def
createSubkey
(
self
,
keyname
):
def
createSubkey
(
self
,
keyname
):
"Create a subkey by name"
handle
=
_winreg
.
CreateKey
(
self
.
handle
,
keyname
)
handle
=
_winreg
.
CreateKey
(
self
.
handle
,
keyname
)
return
RegKey
(
self
.
name
+
"
\
\
"
+
keyname
,
handle
)
return
RegKey
(
self
.
name
+
"
\
\
"
+
keyname
,
handle
)
def
openSubkey
(
self
,
keyname
,
samFlags
=
None
):
def
openSubkey
(
self
,
keyname
,
samFlags
=
None
):
"Open a named subkey"
if
samFlags
:
if
samFlags
:
handle
=
_winreg
.
OpenKey
(
self
.
handle
,
keyname
,
0
,
samFlags
)
handle
=
_winreg
.
OpenKey
(
self
.
handle
,
keyname
,
0
,
samFlags
)
else
:
else
:
...
@@ -211,12 +266,15 @@ class RegKey:
...
@@ -211,12 +266,15 @@ class RegKey:
return
RegKey
(
self
.
name
+
"
\
\
"
+
keyname
,
handle
)
return
RegKey
(
self
.
name
+
"
\
\
"
+
keyname
,
handle
)
def
getSubkeys
(
self
):
def
getSubkeys
(
self
):
"Get a dictionary-like mapping of subkeys"
return
RegKeysDict
(
self
)
return
RegKeysDict
(
self
)
def
getValues
(
self
):
def
getValues
(
self
):
"Get a dictionary-like mapping of data values"
return
RegValuesDict
(
self
)
return
RegValuesDict
(
self
)
def
getValueNameDataAndType
(
self
,
valname
):
def
getValueNameDataAndType
(
self
,
valname
):
"Get a data value's name, data and type all at one time"
try
:
try
:
if
type
(
valname
)
==
IntType
:
if
type
(
valname
)
==
IntType
:
(
valname
,
data
,
datatype
)
=
_winreg
.
EnumValue
(
self
.
handle
,
valname
)
(
valname
,
data
,
datatype
)
=
_winreg
.
EnumValue
(
self
.
handle
,
valname
)
...
@@ -233,10 +291,12 @@ class RegKey:
...
@@ -233,10 +291,12 @@ class RegKey:
return
(
valname
,
data
,
_typeConstants
[
datatype
]
)
return
(
valname
,
data
,
_typeConstants
[
datatype
]
)
def
getValueData
(
self
,
valname
):
def
getValueData
(
self
,
valname
):
"Get a data value's data."
name
,
data
,
type
=
self
.
getValueNameDataAndType
(
valname
)
name
,
data
,
type
=
self
.
getValueNameDataAndType
(
valname
)
return
data
return
data
def
setValue
(
self
,
valname
,
data
,
regtype
=
None
):
def
setValue
(
self
,
valname
,
data
,
regtype
=
None
):
"Set a data value's data (and optionally type)"
if
regtype
:
if
regtype
:
typeint
=
regtype
.
intval
typeint
=
regtype
.
intval
else
:
else
:
...
@@ -250,16 +310,22 @@ class RegKey:
...
@@ -250,16 +310,22 @@ class RegKey:
_winreg
.
SetValueEx
(
self
.
handle
,
valname
,
0
,
typeint
,
data
)
_winreg
.
SetValueEx
(
self
.
handle
,
valname
,
0
,
typeint
,
data
)
def
flush
(
self
):
def
flush
(
self
):
"Make sure that all changes are written to the registry. "
"Only use this if you know what you are doing. "
"It isn't usually needed."
_winreg
.
FlushKey
(
self
.
keyobbj
)
_winreg
.
FlushKey
(
self
.
keyobbj
)
def
save
(
self
,
filename
):
def
save
(
self
,
filename
):
"Save a key to a filename"
_winreg
.
SaveKey
(
self
.
keyobj
,
filename
)
_winreg
.
SaveKey
(
self
.
keyobj
,
filename
)
def
load
(
self
,
subkey
,
filename
):
def
load
(
self
,
subkey
,
filename
):
"Load a key from a filename"
return
_winreg
.
RegLoadKey
(
self
.
handle
,
subkey
,
filename
)
return
_winreg
.
RegLoadKey
(
self
.
handle
,
subkey
,
filename
)
class
RemoteKey
(
RegKey
):
class
RemoteKey
(
RegKey
):
"Open a key on a remote machine"
def
__init__
(
self
,
machine
,
topLevelKey
):
def
__init__
(
self
,
machine
,
topLevelKey
):
assert
topLevelKey
in
_hivenames
assert
topLevelKey
in
_hivenames
self
.
handle
=
_winreg
.
ConnectRegistry
(
machine
,
parentKey
)
self
.
handle
=
_winreg
.
ConnectRegistry
(
machine
,
parentKey
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment