diff --git a/Lib/uuid.py b/Lib/uuid.py
index 7432032..0cbf9f1 100644
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -437,68 +437,86 @@ def _netbios_getnode():
         return ((bytes[0]<<40L) + (bytes[1]<<32L) + (bytes[2]<<24L) +
                 (bytes[3]<<16L) + (bytes[4]<<8L) + bytes[5])
 
-# Thanks to Thomas Heller for ctypes and for his help with its use here.
+_ctypes_lib = None
 
-# If ctypes is available, use it to find system routines for UUID generation.
-_uuid_generate_time = _UuidCreate = None
-try:
-    import ctypes, ctypes.util
-    import sys
+def _uuid_generate(attr):
+    """Find system routines for UUID generation"""
+
+    # Thanks to Thomas Heller for ctypes and for his help with its use here.
+    try:
+        import ctypes
+        import ctypes.util
+
+        global _ctypes_lib
+
+        uuid = None
+        # The uuid_generate_* routines are provided by libuuid on at least
+        # Linux and FreeBSD, and provided by libc on Mac OS X.
+        for libname in ['uuid', 'c']:
+            try:
+                if _ctypes_lib is None:
+                    _ctypes_lib = ctypes.CDLL(ctypes.util.find_library(libname))
+                lib = _ctypes_lib
+            except:
+                continue
+            if hasattr(lib, attr):
+                uuid = getattr(lib, attr)
+                break   # found what we were looking for
+
+        # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
+        # in issue #8621 the function generates the same sequence of values
+        # in the parent process and all children created using fork (unless
+        # those children use exec as well).
+        #
+        # Assume that the uuid_generate functions are broken from 10.5 onward,
+        # the test can be adjusted when a later version is fixed.
+        import sys
+        if sys.platform == 'darwin':
+            import os
+            if int(os.uname()[2].split('.')[0]) >= 9:
+                uuid = None
+        return uuid
+    except:
+        pass
 
-    # The uuid_generate_* routines are provided by libuuid on at least
-    # Linux and FreeBSD, and provided by libc on Mac OS X.
-    _libnames = ['uuid']
-    if not sys.platform.startswith('win'):
-        _libnames.append('c')
-    for libname in _libnames:
+
+def _uuid_create():
+    """Get random UUID on Windows platform."""
+
+    try:
+        # On Windows prior to 2000, UuidCreate gives a UUID containing the
+        # hardware address.  On Windows 2000 and later, UuidCreate makes a
+        # random UUID and UuidCreateSequential gives a UUID containing the
+        # hardware address.  These routines are provided by the RPC runtime.
+        # NOTE:  at least on Tim's WinXP Pro SP2 desktop box, while the last
+        # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
+        # to bear any relationship to the MAC address of any network device
+        # on the box.
         try:
-            lib = ctypes.CDLL(ctypes.util.find_library(libname))
+            import ctypes
+            lib = ctypes.windll.rpcrt4
         except:
-            continue
-        if hasattr(lib, 'uuid_generate_time'):
-            _uuid_generate_time = lib.uuid_generate_time
-            break
-    del _libnames
-
-    # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
-    # in issue #8621 the function generates the same sequence of values
-    # in the parent process and all children created using fork (unless
-    # those children use exec as well).
-    #
-    # Assume that the uuid_generate functions are broken from 10.5 onward,
-    # the test can be adjusted when a later version is fixed.
-    if sys.platform == 'darwin':
-        import os
-        if int(os.uname()[2].split('.')[0]) >= 9:
-            _uuid_generate_time = None
-
-    # On Windows prior to 2000, UuidCreate gives a UUID containing the
-    # hardware address.  On Windows 2000 and later, UuidCreate makes a
-    # random UUID and UuidCreateSequential gives a UUID containing the
-    # hardware address.  These routines are provided by the RPC runtime.
-    # NOTE:  at least on Tim's WinXP Pro SP2 desktop box, while the last
-    # 6 bytes returned by UuidCreateSequential are fixed, they don't appear
-    # to bear any relationship to the MAC address of any network device
-    # on the box.
-    try:
-        lib = ctypes.windll.rpcrt4
+            lib = None
+        uuid = getattr(lib, 'UuidCreateSequential',
+                       getattr(lib, 'UuidCreate', None))
+        return uuid
     except:
-        lib = None
-    _UuidCreate = getattr(lib, 'UuidCreateSequential',
-                          getattr(lib, 'UuidCreate', None))
-except:
-    pass
+        pass
 
 def _unixdll_getnode():
     """Get the hardware address on Unix using ctypes."""
+    import ctypes
     _buffer = ctypes.create_string_buffer(16)
-    _uuid_generate_time(_buffer)
+    uuid_generate_time = _uuid_generate("uuid_generate_time")
+    uuid_generate_time(_buffer)
     return UUID(bytes=_buffer.raw).node
 
 def _windll_getnode():
     """Get the hardware address on Windows using ctypes."""
+    import ctypes
     _buffer = ctypes.create_string_buffer(16)
-    if _UuidCreate(_buffer) == 0:
+    UuidCreate = _uuid_create()
+    if UuidCreate(_buffer) == 0:
         return UUID(bytes=_buffer.raw).node
 
 def _random_getnode():
@@ -546,9 +564,12 @@ def uuid1(node=None, clock_seq=None):
 
     # When the system provides a version-1 UUID generator, use it (but don't
     # use UuidCreate here because its UUIDs don't conform to RFC 4122).
-    if _uuid_generate_time and node is clock_seq is None:
+    uuid_generate_time = _uuid_generate("uuid_generate_time")
+
+    if uuid_generate_time and node is clock_seq is None:
+        import ctypes
         _buffer = ctypes.create_string_buffer(16)
-        _uuid_generate_time(_buffer)
+        uuid_generate_time(_buffer)
         return UUID(bytes=_buffer.raw)
 
     global _last_timestamp
