mirror of
https://github.com/python/cpython.git
synced 2024-11-28 16:45:42 +01:00
acbf461fe5
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. ........
77 lines
2.8 KiB
Python
77 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
|