mirror of
				https://github.com/python/cpython.git
				synced 2025-11-02 22:51:25 +00:00 
			
		
		
		
	svn+ssh://pythondev@svn.python.org/python/trunk ........ r68893 | martin.v.loewis | 2009-01-24 16:47:27 +0100 (Sa, 24 Jan 2009) | 3 lines Issue #3881: Help Tcl to load even when started through the unreadable local symlink to "Program Files" on Vista. ........
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import sys, os
 | 
						|
 | 
						|
# Delay import _tkinter until we have set TCL_LIBRARY,
 | 
						|
# so that Tcl_FindExecutable has a chance to locate its
 | 
						|
# encoding directory.
 | 
						|
 | 
						|
# Unfortunately, we cannot know the TCL_LIBRARY directory
 | 
						|
# if we don't know the tcl version, which we cannot find out
 | 
						|
# without import Tcl. Fortunately, Tcl will itself look in
 | 
						|
# <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, bytes):
 | 
						|
            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("", 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("\\\\?\\"):
 | 
						|
            s = s[4:]
 | 
						|
        return s
 | 
						|
 | 
						|
prefix = os.path.join(sys.prefix,"tcl")
 | 
						|
if not os.path.exists(prefix):
 | 
						|
    # devdir/../tcltk/lib
 | 
						|
    prefix = os.path.join(sys.prefix, os.path.pardir, "tcltk", "lib")
 | 
						|
    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 "TCL_LIBRARY" not in os.environ:
 | 
						|
        for name in os.listdir(prefix):
 | 
						|
            if name.startswith("tcl"):
 | 
						|
                tcldir = os.path.join(prefix,name)
 | 
						|
                if os.path.isdir(tcldir):
 | 
						|
                    os.environ["TCL_LIBRARY"] = tcldir
 | 
						|
    # Compute TK_LIBRARY, knowing that it has the same version
 | 
						|
    # as Tcl
 | 
						|
    import _tkinter
 | 
						|
    ver = str(_tkinter.TCL_VERSION)
 | 
						|
    if "TK_LIBRARY" not in os.environ:
 | 
						|
        v = os.path.join(prefix, 'tk'+ver)
 | 
						|
        if os.path.exists(os.path.join(v, "tclIndex")):
 | 
						|
            os.environ['TK_LIBRARY'] = v
 | 
						|
    # We don't know the Tix version, so we must search the entire
 | 
						|
    # directory
 | 
						|
    if "TIX_LIBRARY" not in os.environ:
 | 
						|
        for name in os.listdir(prefix):
 | 
						|
            if name.startswith("tix"):
 | 
						|
                tixdir = os.path.join(prefix,name)
 | 
						|
                if os.path.isdir(tixdir):
 | 
						|
                    os.environ["TIX_LIBRARY"] = tixdir
 |