diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2009-01-24 15:47:27 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2009-01-24 15:47:27 (GMT) |
commit | f081e1c9d99818328a4e0862e6e9429cbd0a54b7 (patch) | |
tree | 898d18ae5eb76caacd96ce63c898adbaf6f3560f | |
parent | 7d7e1b7c2e6097c36e01b4785cde840193286174 (diff) | |
download | cpython-f081e1c9d99818328a4e0862e6e9429cbd0a54b7.zip cpython-f081e1c9d99818328a4e0862e6e9429cbd0a54b7.tar.gz cpython-f081e1c9d99818328a4e0862e6e9429cbd0a54b7.tar.bz2 |
Issue #3881: Help Tcl to load even when started through the
unreadable local symlink to "Program Files" on Vista.
-rw-r--r-- | Lib/lib-tk/FixTk.py | 35 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
2 files changed, 38 insertions, 0 deletions
diff --git a/Lib/lib-tk/FixTk.py b/Lib/lib-tk/FixTk.py index 346d3c3..cb60b612 100644 --- a/Lib/lib-tk/FixTk.py +++ b/Lib/lib-tk/FixTk.py @@ -10,6 +10,40 @@ import sys, os # <TCL_LIBRARY>\..\tcl<TCL_VERSION>, so anything close to # the real Tcl library will do. +# Expand symbolic links on Vista +try: + import ctypes + ctypes.windll.kernel32.GetFinalPathNameByHandleW +except (ImportError, AttributeError): + def convert_path(s): + return s +else: + def convert_path(s): + if isinstance(s, str): + s = s.decode("mbcs") + hdir = ctypes.windll.kernel32.\ + CreateFileW(s, 0x80, # FILE_READ_ATTRIBUTES + 1, # FILE_SHARE_READ + None, 3, # OPEN_EXISTING + 0x02000000, # FILE_FLAG_BACKUP_SEMANTICS + None) + if hdir == -1: + # Cannot open directory, give up + return s + buf = ctypes.create_unicode_buffer(u"", 32768) + res = ctypes.windll.kernel32.\ + GetFinalPathNameByHandleW(hdir, buf, len(buf), + 0) # VOLUME_NAME_DOS + ctypes.windll.kernel32.CloseHandle(hdir) + if res == 0: + # Conversion failed (e.g. network location) + return s + s = buf[:res] + # Ignore leading \\?\ + if s.startswith(u"\\\\?\\"): + s = s[4:] + return s + prefix = os.path.join(sys.prefix,"tcl") if not os.path.exists(prefix): # devdir/../tcltk/lib @@ -17,6 +51,7 @@ if not os.path.exists(prefix): prefix = os.path.abspath(prefix) # if this does not exist, no further search is needed if os.path.exists(prefix): + prefix = convert_path(prefix) if not os.environ.has_key("TCL_LIBRARY"): for name in os.listdir(prefix): if name.startswith("tcl"): @@ -145,6 +145,9 @@ Core and Builtins Library ------- +- Issue #3881: Help Tcl to load even when started through the + unreadable local symlink to "Program Files" on Vista. + - Issue #4710: Extract directories properly in the zipfile module; allow adding directories to a zipfile. |