mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-11-01 01:07:54 +00:00
178 lines
5.2 KiB
Python
178 lines
5.2 KiB
Python
# copyright McMillan Enterprises, 1999
|
|
import os, sys
|
|
import string
|
|
|
|
SCRIPT = 1
|
|
GSCRIPT = 2
|
|
MODULE = 3
|
|
PACKAGE = 4
|
|
PBINARY = 5
|
|
BINARY = 6
|
|
ZLIB = 7
|
|
DIRECTORY = 8
|
|
DATA = 9
|
|
|
|
_bpath = None
|
|
_ppath = None
|
|
_pcache = {}
|
|
|
|
def _locate(nm, xtrapath=None, base=None):
|
|
"""Find a file / directory named NM in likely places.
|
|
|
|
XTRAPATH is a list of paths to prepend to BASE.
|
|
If BASE is None, sys.path (as extended by packages) is used."""
|
|
ppath = base
|
|
if base is None:
|
|
ppath = _ppath
|
|
if xtrapath:
|
|
ppath = xtrapath + ppath
|
|
for pth in ppath:
|
|
fullnm = os.path.join(pth, nm)
|
|
#print " _locate trying", fullnm
|
|
if os.path.exists(fullnm):
|
|
break
|
|
else:
|
|
return ''
|
|
return fullnm
|
|
|
|
def _locatepython(name, xtrapath=None):
|
|
"""Locate a Python resource named NAME.
|
|
|
|
All of the standard file extensions will be tried.
|
|
XTRAPATH is prepended to sys.path."""
|
|
for ext in ('.py', '.pyc', '.pyw', '.pyo', '.pyd', '.dll'):
|
|
fullnm = _locate(name+ext, xtrapath)
|
|
if fullnm:
|
|
break
|
|
else:
|
|
for ext in ('.pyd', '.dll'):
|
|
fullnm = _locate(name+ext, [], _bpath)
|
|
if fullnm:
|
|
break
|
|
return fullnm
|
|
|
|
def ispackage(name):
|
|
"""Determine if NAME is the name of a package."""
|
|
if os.path.exists(os.path.join(name, '__init__.py')):
|
|
return 1
|
|
if os.path.exists(os.path.join(name, '__init__.pyc')):
|
|
return 1
|
|
if os.path.exists(os.path.join(name, '__init__.pyo')):
|
|
return 1
|
|
return 0
|
|
|
|
def idtype(fullnm):
|
|
"""Figure out what type of resource FULLNM refers to."""
|
|
if os.path.isdir(fullnm):
|
|
if ispackage(fullnm):
|
|
return PACKAGE
|
|
return DIRECTORY
|
|
ext = os.path.splitext(fullnm)[1]
|
|
if ext:
|
|
if ext == '.pyd':
|
|
return PBINARY
|
|
if ext == '.dll':
|
|
return BINARY
|
|
if ext in ('.pyc', '.pyo'):
|
|
return MODULE
|
|
if ext == '.py':
|
|
return SCRIPT
|
|
if ext == '.pyw':
|
|
return GSCRIPT
|
|
if ext == '.pyz':
|
|
return ZLIB
|
|
return DATA
|
|
|
|
def identify(name, xtrapath=None):
|
|
"""Find, and identify the type of NAME, using XTRAPATH as the
|
|
first place to look.
|
|
|
|
Return type, name and full path name.
|
|
NAME can be a logical or physical name. However, the logical
|
|
name of a Python module can easily conflict with the physical
|
|
name of something else, so beware."""
|
|
if os.path.exists(name):
|
|
fullnm = name
|
|
else:
|
|
if xtrapath is None:
|
|
xtra = []
|
|
elif id(xtrapath) in _pcache:
|
|
xtra = _pcache[id(xtrapath)]
|
|
else:
|
|
xtra = expand(xtrapath)
|
|
_pcache[id(xtrapath)] = xtra
|
|
fullnm = _locate(name, xtra)
|
|
if not fullnm:
|
|
fullnm = _locate(name, [], _bpath)
|
|
if not fullnm:
|
|
ext = os.path.splitext(name)[1]
|
|
if not ext:
|
|
fullnm = _locatepython(name, xtra)
|
|
if not fullnm:
|
|
raise ValueError, "%s not found" % name
|
|
else:
|
|
nm = name
|
|
while string.count(nm, '.'):
|
|
nm = string.replace(nm, '.', '/', 1)
|
|
fullnm = _locatepython(nm, xtra)
|
|
if fullnm:
|
|
break
|
|
else:
|
|
raise ValueError, "%s not found" % name
|
|
|
|
typ = idtype(fullnm)
|
|
nm = name
|
|
if typ in (GSCRIPT, SCRIPT, MODULE, PACKAGE, PBINARY):
|
|
dir, nm = os.path.split(fullnm)
|
|
nm = os.path.splitext(nm)[0]
|
|
if typ == SCRIPT:
|
|
if os.path.exists(fullnm+'c') or os.path.exists(fullnm+'o'):
|
|
typ = MODULE
|
|
if typ in (MODULE, PACKAGE):
|
|
while idtype(dir) == PACKAGE:
|
|
dir, lnode = os.path.split(dir)
|
|
nm = lnode+'.'+nm
|
|
elif typ == BINARY:
|
|
nm = os.path.basename(fullnm)
|
|
return typ, nm, fullnm
|
|
|
|
def expand(plist):
|
|
""" expand a list of paths (like sys.path) to include all the
|
|
directories that qualify as packages """
|
|
pkgdirs = []
|
|
for pth in plist:
|
|
os.path.walk(pth, pkgfinder, pkgdirs)
|
|
return plist + pkgdirs
|
|
|
|
def pkgfinder(pkgdirs, dir, fnms):
|
|
i = 0
|
|
while i < len(fnms):
|
|
fnm = os.path.join(dir, fnms[i])
|
|
if os.path.isdir(fnm):
|
|
if ispackage(fnm):
|
|
pkgdirs.append(fnm)
|
|
i = i + 1
|
|
else:
|
|
del fnms[i]
|
|
else:
|
|
i = i + 1
|
|
|
|
if _bpath is None:
|
|
try:
|
|
import win32api
|
|
except ImportError:
|
|
print "Cannot determine your Windows or System directories"
|
|
print "Please add them to your PATH if .dlls are not found"
|
|
_bpath = []
|
|
else:
|
|
sysdir = win32api.GetSystemDirectory()
|
|
sysdir2 = os.path.join(sysdir, '../SYSTEM')
|
|
windir = win32api.GetWindowsDirectory()
|
|
_bpath = [sysdir, sysdir2, windir]
|
|
_bpath.extend(string.split(os.environ.get('PATH', ''), ';'))
|
|
if _ppath is None:
|
|
_ppath = expand(sys.path)
|
|
|
|
def getpath():
|
|
"""Return the path that Windows will search for dlls."""
|
|
return _bpath
|