Current Path: > > opt > alt > > python310 > lib64 > python3.10
Operation : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 Software : Apache Server IP : 162.0.232.56 | Your IP: 216.73.216.111 Domains : 1034 Domain(s) Permission : [ 0755 ]
Name | Type | Size | Last Modified | Actions |
---|---|---|---|---|
__pycache__ | Directory | - | - | |
asyncio | Directory | - | - | |
collections | Directory | - | - | |
concurrent | Directory | - | - | |
config-3.10-x86_64-linux-gnu | Directory | - | - | |
ctypes | Directory | - | - | |
curses | Directory | - | - | |
dbm | Directory | - | - | |
distutils | Directory | - | - | |
Directory | - | - | ||
encodings | Directory | - | - | |
ensurepip | Directory | - | - | |
html | Directory | - | - | |
http | Directory | - | - | |
importlib | Directory | - | - | |
json | Directory | - | - | |
lib-dynload | Directory | - | - | |
lib2to3 | Directory | - | - | |
logging | Directory | - | - | |
multiprocessing | Directory | - | - | |
pydoc_data | Directory | - | - | |
site-packages | Directory | - | - | |
sqlite3 | Directory | - | - | |
unittest | Directory | - | - | |
urllib | Directory | - | - | |
venv | Directory | - | - | |
wsgiref | Directory | - | - | |
xml | Directory | - | - | |
xmlrpc | Directory | - | - | |
zoneinfo | Directory | - | - | |
LICENSE.txt | File | 13936 bytes | June 03 2025 18:23:41. | |
__future__.py | File | 5155 bytes | June 03 2025 18:23:41. | |
__phello__.foo.py | File | 64 bytes | June 03 2025 18:23:41. | |
_aix_support.py | File | 3270 bytes | June 03 2025 18:23:41. | |
_bootsubprocess.py | File | 2675 bytes | June 03 2025 18:23:41. | |
_collections_abc.py | File | 32284 bytes | June 03 2025 18:23:41. | |
_compat_pickle.py | File | 8749 bytes | June 03 2025 18:23:41. | |
_compression.py | File | 5681 bytes | June 03 2025 18:23:41. | |
_markupbase.py | File | 14653 bytes | June 03 2025 18:23:41. | |
_osx_support.py | File | 21787 bytes | June 03 2025 18:23:41. | |
_py_abc.py | File | 6189 bytes | June 03 2025 18:23:41. | |
_pydecimal.py | File | 228676 bytes | June 03 2025 18:23:41. | |
_pyio.py | File | 94467 bytes | June 03 2025 18:23:41. | |
_sitebuiltins.py | File | 3128 bytes | June 03 2025 18:23:41. | |
_strptime.py | File | 25277 bytes | June 03 2025 18:23:41. | |
_sysconfigdata__linux_x86_64-linux-gnu.py | File | 41345 bytes | June 18 2025 15:53:46. | |
_sysconfigdata_d_linux_x86_64-linux-gnu.py | File | 40763 bytes | June 18 2025 15:42:57. | |
_threading_local.py | File | 7220 bytes | June 03 2025 18:23:41. | |
_weakrefset.py | File | 5923 bytes | June 03 2025 18:23:41. | |
abc.py | File | 6522 bytes | June 03 2025 18:23:41. | |
aifc.py | File | 32605 bytes | June 03 2025 18:23:41. | |
antigravity.py | File | 500 bytes | June 03 2025 18:23:41. | |
argparse.py | File | 98543 bytes | June 03 2025 18:23:41. | |
ast.py | File | 59900 bytes | June 03 2025 18:23:41. | |
asynchat.py | File | 11520 bytes | June 03 2025 18:23:41. | |
asyncore.py | File | 20268 bytes | June 03 2025 18:23:41. | |
base64.py | File | 20860 bytes | June 03 2025 18:23:41. | |
bdb.py | File | 32396 bytes | June 03 2025 18:23:41. | |
binhex.py | File | 14784 bytes | June 03 2025 18:23:41. | |
bisect.py | File | 3135 bytes | June 03 2025 18:23:41. | |
bz2.py | File | 11847 bytes | June 03 2025 18:23:41. | |
cProfile.py | File | 6360 bytes | June 03 2025 18:23:41. | |
calendar.py | File | 24575 bytes | June 03 2025 18:23:41. | |
cgi.py | File | 34111 bytes | June 03 2025 18:23:41. | |
cgitb.py | File | 12096 bytes | June 03 2025 18:23:41. | |
chunk.py | File | 5435 bytes | June 03 2025 18:23:41. | |
cmd.py | File | 14860 bytes | June 03 2025 18:23:41. | |
code.py | File | 10622 bytes | June 03 2025 18:23:41. | |
codecs.py | File | 36714 bytes | June 03 2025 18:23:41. | |
codeop.py | File | 5609 bytes | June 03 2025 18:23:41. | |
colorsys.py | File | 4017 bytes | June 03 2025 18:23:41. | |
compileall.py | File | 20252 bytes | June 03 2025 18:23:41. | |
configparser.py | File | 54612 bytes | June 03 2025 18:23:41. | |
contextlib.py | File | 25882 bytes | June 03 2025 18:23:41. | |
contextvars.py | File | 129 bytes | June 03 2025 18:23:41. | |
copy.py | File | 8681 bytes | June 03 2025 18:23:41. | |
copyreg.py | File | 7426 bytes | June 03 2025 18:23:41. | |
crypt.py | File | 3848 bytes | June 03 2025 18:23:41. | |
csv.py | File | 16030 bytes | June 03 2025 18:23:41. | |
dataclasses.py | File | 56390 bytes | June 03 2025 18:23:41. | |
datetime.py | File | 88086 bytes | June 03 2025 18:23:41. | |
decimal.py | File | 320 bytes | June 03 2025 18:23:41. | |
difflib.py | File | 83308 bytes | June 03 2025 18:23:41. | |
dis.py | File | 20020 bytes | June 03 2025 18:23:41. | |
doctest.py | File | 105143 bytes | June 03 2025 18:23:41. | |
enum.py | File | 39831 bytes | June 03 2025 18:23:41. | |
filecmp.py | File | 10178 bytes | June 03 2025 18:23:41. | |
fileinput.py | File | 16442 bytes | June 03 2025 18:23:41. | |
fnmatch.py | File | 6713 bytes | June 03 2025 18:23:41. | |
fractions.py | File | 28242 bytes | June 03 2025 18:23:41. | |
ftplib.py | File | 35496 bytes | June 03 2025 18:23:41. | |
functools.py | File | 38076 bytes | June 03 2025 18:23:41. | |
genericpath.py | File | 5246 bytes | June 03 2025 18:23:41. | |
getopt.py | File | 7489 bytes | June 03 2025 18:23:41. | |
getpass.py | File | 5990 bytes | June 03 2025 18:23:41. | |
gettext.py | File | 27266 bytes | June 03 2025 18:23:41. | |
glob.py | File | 7888 bytes | June 03 2025 18:23:41. | |
graphlib.py | File | 9573 bytes | June 03 2025 18:23:41. | |
gzip.py | File | 21849 bytes | June 03 2025 18:23:41. | |
hashlib.py | File | 10229 bytes | June 03 2025 18:23:41. | |
heapq.py | File | 22877 bytes | June 03 2025 18:23:41. | |
hmac.py | File | 7717 bytes | June 03 2025 18:23:41. | |
imaplib.py | File | 55218 bytes | June 03 2025 18:23:41. | |
imghdr.py | File | 3808 bytes | June 03 2025 18:23:41. | |
imp.py | File | 10591 bytes | June 03 2025 18:23:41. | |
inspect.py | File | 124378 bytes | June 03 2025 18:23:41. | |
io.py | File | 4196 bytes | June 03 2025 18:23:41. | |
ipaddress.py | File | 80837 bytes | June 03 2025 18:23:41. | |
keyword.py | File | 1061 bytes | June 03 2025 18:23:41. | |
linecache.py | File | 5690 bytes | June 03 2025 18:23:41. | |
locale.py | File | 78124 bytes | June 03 2025 18:23:41. | |
lzma.py | File | 13277 bytes | June 03 2025 18:23:41. | |
mailbox.py | File | 78794 bytes | June 03 2025 18:23:41. | |
mailcap.py | File | 9116 bytes | June 03 2025 18:23:41. | |
mimetypes.py | File | 22539 bytes | June 03 2025 18:23:41. | |
modulefinder.py | File | 24401 bytes | June 03 2025 18:23:41. | |
netrc.py | File | 5747 bytes | June 03 2025 18:23:41. | |
nntplib.py | File | 41023 bytes | June 03 2025 18:23:41. | |
ntpath.py | File | 29944 bytes | June 03 2025 18:23:41. | |
nturl2path.py | File | 2887 bytes | June 03 2025 18:23:41. | |
numbers.py | File | 10348 bytes | June 03 2025 18:23:41. | |
opcode.py | File | 5902 bytes | June 03 2025 18:23:41. | |
operator.py | File | 10751 bytes | June 03 2025 18:23:41. | |
optparse.py | File | 60369 bytes | June 03 2025 18:23:41. | |
os.py | File | 39557 bytes | June 03 2025 18:23:41. | |
pathlib.py | File | 49575 bytes | June 03 2025 18:23:41. | |
pdb.py | File | 63238 bytes | June 03 2025 18:23:41. | |
pickle.py | File | 64949 bytes | June 03 2025 18:23:41. | |
pickletools.py | File | 93486 bytes | June 03 2025 18:23:41. | |
pipes.py | File | 8914 bytes | June 03 2025 18:23:41. | |
pkgutil.py | File | 24576 bytes | June 03 2025 18:23:41. | |
platform.py | File | 42036 bytes | June 03 2025 18:23:41. | |
plistlib.py | File | 28352 bytes | June 03 2025 18:23:41. | |
poplib.py | File | 15198 bytes | June 03 2025 18:23:41. | |
posixpath.py | File | 16436 bytes | June 03 2025 18:23:41. | |
pprint.py | File | 24444 bytes | June 03 2025 18:23:41. | |
profile.py | File | 22896 bytes | June 03 2025 18:23:41. | |
pstats.py | File | 29326 bytes | June 03 2025 18:23:41. | |
pty.py | File | 5213 bytes | June 03 2025 18:23:41. | |
py_compile.py | File | 7892 bytes | June 18 2025 15:40:22. | |
pyclbr.py | File | 11396 bytes | June 03 2025 18:23:41. | |
pydoc.py | File | 109603 bytes | June 03 2025 18:23:41. | |
queue.py | File | 11496 bytes | June 03 2025 18:23:41. | |
quopri.py | File | 7281 bytes | June 03 2025 18:23:41. | |
random.py | File | 33221 bytes | June 03 2025 18:23:41. | |
re.py | File | 15860 bytes | June 03 2025 18:23:41. | |
reprlib.py | File | 5267 bytes | June 03 2025 18:23:41. | |
rlcompleter.py | File | 7817 bytes | June 03 2025 18:23:41. | |
runpy.py | File | 13111 bytes | June 03 2025 18:23:41. | |
sched.py | File | 6351 bytes | June 03 2025 18:23:41. | |
secrets.py | File | 2036 bytes | June 03 2025 18:23:41. | |
selectors.py | File | 19536 bytes | June 03 2025 18:23:41. | |
shelve.py | File | 8560 bytes | June 03 2025 18:23:41. | |
shlex.py | File | 13501 bytes | June 03 2025 18:23:41. | |
shutil.py | File | 54572 bytes | June 03 2025 18:23:41. | |
signal.py | File | 2438 bytes | June 03 2025 18:23:41. | |
site.py | File | 22926 bytes | June 03 2025 18:23:41. | |
smtpd.py | File | 35178 bytes | June 03 2025 18:23:41. | |
smtplib.py | File | 45431 bytes | June 03 2025 18:23:41. | |
sndhdr.py | File | 7099 bytes | June 03 2025 18:23:41. | |
socket.py | File | 37006 bytes | June 03 2025 18:23:41. | |
socketserver.py | File | 27296 bytes | June 03 2025 18:23:41. | |
sre_compile.py | File | 27973 bytes | June 03 2025 18:23:41. | |
sre_constants.py | File | 7177 bytes | June 03 2025 18:23:41. | |
sre_parse.py | File | 40779 bytes | June 03 2025 18:23:41. | |
ssl.py | File | 53895 bytes | June 03 2025 18:23:41. | |
stat.py | File | 5485 bytes | June 03 2025 18:23:41. | |
statistics.py | File | 43205 bytes | June 03 2025 18:23:41. | |
string.py | File | 10566 bytes | June 03 2025 18:23:41. | |
stringprep.py | File | 12917 bytes | June 03 2025 18:23:41. | |
struct.py | File | 257 bytes | June 03 2025 18:23:41. | |
subprocess.py | File | 84917 bytes | June 03 2025 18:23:41. | |
sunau.py | File | 18158 bytes | June 03 2025 18:23:41. | |
symtable.py | File | 10217 bytes | June 03 2025 18:23:41. | |
sysconfig.py | File | 27609 bytes | June 03 2025 18:23:41. | |
tabnanny.py | File | 11312 bytes | June 03 2025 18:23:41. | |
tarfile.py | File | 111609 bytes | June 03 2025 18:23:41. | |
telnetlib.py | File | 23254 bytes | June 03 2025 18:23:41. | |
tempfile.py | File | 29469 bytes | June 03 2025 18:23:41. | |
textwrap.py | File | 19772 bytes | June 03 2025 18:23:41. | |
this.py | File | 1003 bytes | June 03 2025 18:23:41. | |
threading.py | File | 56742 bytes | June 18 2025 15:40:22. | |
timeit.py | File | 13508 bytes | June 03 2025 18:23:41. | |
token.py | File | 2386 bytes | June 03 2025 18:23:41. | |
tokenize.py | File | 25921 bytes | June 03 2025 18:23:41. | |
trace.py | File | 29229 bytes | June 03 2025 18:23:41. | |
traceback.py | File | 26222 bytes | June 03 2025 18:23:41. | |
tracemalloc.py | File | 18047 bytes | June 03 2025 18:23:41. | |
tty.py | File | 879 bytes | June 03 2025 18:23:41. | |
types.py | File | 10117 bytes | June 03 2025 18:23:41. | |
typing.py | File | 92557 bytes | June 03 2025 18:23:41. | |
uu.py | File | 7277 bytes | June 18 2025 15:55:11. | |
uuid.py | File | 27500 bytes | June 03 2025 18:23:41. | |
warnings.py | File | 19688 bytes | June 03 2025 18:23:41. | |
wave.py | File | 18004 bytes | June 03 2025 18:23:41. | |
weakref.py | File | 21560 bytes | June 03 2025 18:23:41. | |
webbrowser.py | File | 24258 bytes | June 03 2025 18:23:41. | |
xdrlib.py | File | 5913 bytes | June 03 2025 18:23:41. | |
zipapp.py | File | 7535 bytes | June 03 2025 18:23:41. | |
zipfile.py | File | 90201 bytes | June 03 2025 18:23:41. | |
zipimport.py | File | 30891 bytes | June 03 2025 18:23:41. |
"""Access to Python's configuration information.""" import os import sys from os.path import pardir, realpath __all__ = [ 'get_config_h_filename', 'get_config_var', 'get_config_vars', 'get_makefile_filename', 'get_path', 'get_path_names', 'get_paths', 'get_platform', 'get_python_version', 'get_scheme_names', 'parse_config_h', ] # Keys for get_config_var() that are never converted to Python integers. _ALWAYS_STR = { 'MACOSX_DEPLOYMENT_TARGET', } _INSTALL_SCHEMES = { 'posix_prefix': { 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}', 'purelib': '{base}/lib/python{py_version_short}/site-packages', 'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages', 'include': '{installed_base}/include/python{py_version_short}{abiflags}', 'platinclude': '{installed_platbase}/include/python{py_version_short}{abiflags}', 'scripts': '{base}/bin', 'data': '{base}', }, 'posix_home': { 'stdlib': '{installed_base}/lib/python', 'platstdlib': '{base}/lib/python', 'purelib': '{base}/lib/python', 'platlib': '{base}/lib/python', 'include': '{installed_base}/include/python', 'platinclude': '{installed_base}/include/python', 'scripts': '{base}/bin', 'data': '{base}', }, 'nt': { 'stdlib': '{installed_base}/Lib', 'platstdlib': '{base}/Lib', 'purelib': '{base}/Lib/site-packages', 'platlib': '{base}/Lib/site-packages', 'include': '{installed_base}/Include', 'platinclude': '{installed_base}/Include', 'scripts': '{base}/Scripts', 'data': '{base}', }, } # NOTE: site.py has copy of this function. # Sync it when modify this function. def _getuserbase(): env_base = os.environ.get("PYTHONUSERBASE", None) if env_base: return env_base # VxWorks has no home directories if sys.platform == "vxworks": return None def joinuser(*args): return os.path.expanduser(os.path.join(*args)) if os.name == "nt": base = os.environ.get("APPDATA") or "~" return joinuser(base, "Python") if sys.platform == "darwin" and sys._framework: return joinuser("~", "Library", sys._framework, f"{sys.version_info[0]}.{sys.version_info[1]}") return joinuser("~", ".local") _HAS_USER_BASE = (_getuserbase() is not None) if _HAS_USER_BASE: _INSTALL_SCHEMES |= { # NOTE: When modifying "purelib" scheme, update site._get_path() too. 'nt_user': { 'stdlib': '{userbase}/Python{py_version_nodot_plat}', 'platstdlib': '{userbase}/Python{py_version_nodot_plat}', 'purelib': '{userbase}/Python{py_version_nodot_plat}/site-packages', 'platlib': '{userbase}/Python{py_version_nodot_plat}/site-packages', 'include': '{userbase}/Python{py_version_nodot_plat}/Include', 'scripts': '{userbase}/Python{py_version_nodot_plat}/Scripts', 'data': '{userbase}', }, 'posix_user': { 'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', 'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}', 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', 'include': '{userbase}/include/python{py_version_short}', 'scripts': '{userbase}/bin', 'data': '{userbase}', }, 'osx_framework_user': { 'stdlib': '{userbase}/lib/python', 'platstdlib': '{userbase}/lib/python', 'purelib': '{userbase}/lib/python/site-packages', 'platlib': '{userbase}/lib/python/site-packages', 'include': '{userbase}/include/python{py_version_short}', 'scripts': '{userbase}/bin', 'data': '{userbase}', }, } _SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include', 'scripts', 'data') _PY_VERSION = sys.version.split()[0] _PY_VERSION_SHORT = f'{sys.version_info[0]}.{sys.version_info[1]}' _PY_VERSION_SHORT_NO_DOT = f'{sys.version_info[0]}{sys.version_info[1]}' _PREFIX = os.path.normpath(sys.prefix) _BASE_PREFIX = os.path.normpath(sys.base_prefix) _EXEC_PREFIX = os.path.normpath(sys.exec_prefix) _BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix) _CONFIG_VARS = None _USER_BASE = None # Regexes needed for parsing Makefile (and similar syntaxes, # like old-style Setup files). _variable_rx = r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)" _findvar1_rx = r"\$\(([A-Za-z][A-Za-z0-9_]*)\)" _findvar2_rx = r"\${([A-Za-z][A-Za-z0-9_]*)}" def _safe_realpath(path): try: return realpath(path) except OSError: return path if sys.executable: _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) else: # sys.executable can be empty if argv[0] has been changed and Python is # unable to retrieve the real program name _PROJECT_BASE = _safe_realpath(os.getcwd()) if (os.name == 'nt' and _PROJECT_BASE.lower().endswith(('\\pcbuild\\win32', '\\pcbuild\\amd64'))): _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) # set for cross builds if "_PYTHON_PROJECT_BASE" in os.environ: _PROJECT_BASE = _safe_realpath(os.environ["_PYTHON_PROJECT_BASE"]) def _is_python_source_dir(d): for fn in ("Setup", "Setup.local"): if os.path.isfile(os.path.join(d, "Modules", fn)): return True return False _sys_home = getattr(sys, '_home', None) if os.name == 'nt': def _fix_pcbuild(d): if d and os.path.normcase(d).startswith( os.path.normcase(os.path.join(_PREFIX, "PCbuild"))): return _PREFIX return d _PROJECT_BASE = _fix_pcbuild(_PROJECT_BASE) _sys_home = _fix_pcbuild(_sys_home) def is_python_build(check_home=False): if check_home and _sys_home: return _is_python_source_dir(_sys_home) return _is_python_source_dir(_PROJECT_BASE) _PYTHON_BUILD = is_python_build(True) if _PYTHON_BUILD: for scheme in ('posix_prefix', 'posix_home'): # On POSIX-y platforms, Python will: # - Build from .h files in 'headers' (which is only added to the # scheme when building CPython) # - Install .h files to 'include' scheme = _INSTALL_SCHEMES[scheme] scheme['headers'] = scheme['include'] scheme['include'] = '{srcdir}/Include' scheme['platinclude'] = '{projectbase}/.' def _subst_vars(s, local_vars): try: return s.format(**local_vars) except KeyError as var: try: return s.format(**os.environ) except KeyError: raise AttributeError(f'{var}') from None def _extend_dict(target_dict, other_dict): target_keys = target_dict.keys() for key, value in other_dict.items(): if key in target_keys: continue target_dict[key] = value def _expand_vars(scheme, vars): res = {} if vars is None: vars = {} _extend_dict(vars, get_config_vars()) for key, value in _INSTALL_SCHEMES[scheme].items(): if os.name in ('posix', 'nt'): value = os.path.expanduser(value) res[key] = os.path.normpath(_subst_vars(value, vars)) return res def _get_preferred_schemes(): if os.name == 'nt': return { 'prefix': 'nt', 'home': 'posix_home', 'user': 'nt_user', } if sys.platform == 'darwin' and sys._framework: return { 'prefix': 'posix_prefix', 'home': 'posix_home', 'user': 'osx_framework_user', } return { 'prefix': 'posix_prefix', 'home': 'posix_home', 'user': 'posix_user', } def get_preferred_scheme(key): scheme = _get_preferred_schemes()[key] if scheme not in _INSTALL_SCHEMES: raise ValueError( f"{key!r} returned {scheme!r}, which is not a valid scheme " f"on this platform" ) return scheme def get_default_scheme(): return get_preferred_scheme('prefix') def _parse_makefile(filename, vars=None, keep_unresolved=True): """Parse a Makefile-style file. A dictionary containing name/value pairs is returned. If an optional dictionary is passed in as the second argument, it is used instead of a new dictionary. """ import re if vars is None: vars = {} done = {} notdone = {} with open(filename, encoding=sys.getfilesystemencoding(), errors="surrogateescape") as f: lines = f.readlines() for line in lines: if line.startswith('#') or line.strip() == '': continue m = re.match(_variable_rx, line) if m: n, v = m.group(1, 2) v = v.strip() # `$$' is a literal `$' in make tmpv = v.replace('$$', '') if "$" in tmpv: notdone[n] = v else: try: if n in _ALWAYS_STR: raise ValueError v = int(v) except ValueError: # insert literal `$' done[n] = v.replace('$$', '$') else: done[n] = v # do variable interpolation here variables = list(notdone.keys()) # Variables with a 'PY_' prefix in the makefile. These need to # be made available without that prefix through sysconfig. # Special care is needed to ensure that variable expansion works, even # if the expansion uses the name without a prefix. renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') while len(variables) > 0: for name in tuple(variables): value = notdone[name] m1 = re.search(_findvar1_rx, value) m2 = re.search(_findvar2_rx, value) if m1 and m2: m = m1 if m1.start() < m2.start() else m2 else: m = m1 if m1 else m2 if m is not None: n = m.group(1) found = True if n in done: item = str(done[n]) elif n in notdone: # get it on a subsequent round found = False elif n in os.environ: # do it like make: fall back to environment item = os.environ[n] elif n in renamed_variables: if (name.startswith('PY_') and name[3:] in renamed_variables): item = "" elif 'PY_' + n in notdone: found = False else: item = str(done['PY_' + n]) else: done[n] = item = "" if found: after = value[m.end():] value = value[:m.start()] + item + after if "$" in after: notdone[name] = value else: try: if name in _ALWAYS_STR: raise ValueError value = int(value) except ValueError: done[name] = value.strip() else: done[name] = value variables.remove(name) if name.startswith('PY_') \ and name[3:] in renamed_variables: name = name[3:] if name not in done: done[name] = value else: # Adds unresolved variables to the done dict. # This is disabled when called from distutils.sysconfig if keep_unresolved: done[name] = value # bogus variable reference (e.g. "prefix=$/opt/python"); # just drop it since we can't deal variables.remove(name) # strip spurious spaces for k, v in done.items(): if isinstance(v, str): done[k] = v.strip() # save the results in the global dictionary vars.update(done) return vars def get_makefile_filename(): """Return the path of the Makefile.""" if _PYTHON_BUILD: return os.path.join(_sys_home or _PROJECT_BASE, "Makefile") if hasattr(sys, 'abiflags'): config_dir_name = f'config-{_PY_VERSION_SHORT}{sys.abiflags}' else: config_dir_name = 'config' if hasattr(sys.implementation, '_multiarch'): config_dir_name += f'-{sys.implementation._multiarch}' return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') def _get_sysconfigdata_name(): multiarch = getattr(sys.implementation, '_multiarch', '') return os.environ.get( '_PYTHON_SYSCONFIGDATA_NAME', f'_sysconfigdata_{sys.abiflags}_{sys.platform}_{multiarch}', ) def _generate_posix_vars(): """Generate the Python module containing build-time variables.""" import pprint vars = {} # load the installed Makefile: makefile = get_makefile_filename() try: _parse_makefile(makefile, vars) except OSError as e: msg = f"invalid Python installation: unable to open {makefile}" if hasattr(e, "strerror"): msg = f"{msg} ({e.strerror})" raise OSError(msg) # load the installed pyconfig.h: config_h = get_config_h_filename() try: with open(config_h, encoding="utf-8") as f: parse_config_h(f, vars) except OSError as e: msg = f"invalid Python installation: unable to open {config_h}" if hasattr(e, "strerror"): msg = f"{msg} ({e.strerror})" raise OSError(msg) # On AIX, there are wrong paths to the linker scripts in the Makefile # -- these paths are relative to the Python source, but when installed # the scripts are in another directory. if _PYTHON_BUILD: vars['BLDSHARED'] = vars['LDSHARED'] # There's a chicken-and-egg situation on OS X with regards to the # _sysconfigdata module after the changes introduced by #15298: # get_config_vars() is called by get_platform() as part of the # `make pybuilddir.txt` target -- which is a precursor to the # _sysconfigdata.py module being constructed. Unfortunately, # get_config_vars() eventually calls _init_posix(), which attempts # to import _sysconfigdata, which we won't have built yet. In order # for _init_posix() to work, if we're on Darwin, just mock up the # _sysconfigdata module manually and populate it with the build vars. # This is more than sufficient for ensuring the subsequent call to # get_platform() succeeds. name = _get_sysconfigdata_name() if 'darwin' in sys.platform: import types module = types.ModuleType(name) module.build_time_vars = vars sys.modules[name] = module pybuilddir = f'build/lib.{get_platform()}-{_PY_VERSION_SHORT}' if hasattr(sys, "gettotalrefcount"): pybuilddir += '-pydebug' os.makedirs(pybuilddir, exist_ok=True) destfile = os.path.join(pybuilddir, name + '.py') with open(destfile, 'w', encoding='utf8') as f: f.write('# system configuration generated and used by' ' the sysconfig module\n') f.write('build_time_vars = ') pprint.pprint(vars, stream=f) # Create file used for sys.path fixup -- see Modules/getpath.c with open('pybuilddir.txt', 'w', encoding='utf8') as f: f.write(pybuilddir) def _init_posix(vars): """Initialize the module as appropriate for POSIX systems.""" # _sysconfigdata is generated at build time, see _generate_posix_vars() name = _get_sysconfigdata_name() _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0) build_time_vars = _temp.build_time_vars vars.update(build_time_vars) def _init_non_posix(vars): """Initialize the module as appropriate for NT""" # set basic install directories import _imp vars['LIBDEST'] = get_path('stdlib') vars['BINLIBDEST'] = get_path('platstdlib') vars['INCLUDEPY'] = get_path('include') vars['EXT_SUFFIX'] = _imp.extension_suffixes()[0] vars['EXE'] = '.exe' vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) vars['TZPATH'] = '' # # public APIs # def parse_config_h(fp, vars=None): """Parse a config.h-style file. A dictionary containing name/value pairs is returned. If an optional dictionary is passed in as the second argument, it is used instead of a new dictionary. """ if vars is None: vars = {} import re define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") while True: line = fp.readline() if not line: break m = define_rx.match(line) if m: n, v = m.group(1, 2) try: if n in _ALWAYS_STR: raise ValueError v = int(v) except ValueError: pass vars[n] = v else: m = undef_rx.match(line) if m: vars[m.group(1)] = 0 return vars def get_config_h_filename(): """Return the path of pyconfig.h.""" if _PYTHON_BUILD: if os.name == "nt": inc_dir = os.path.join(_sys_home or _PROJECT_BASE, "PC") else: inc_dir = _sys_home or _PROJECT_BASE else: inc_dir = get_path('platinclude') return os.path.join(inc_dir, 'pyconfig.h') def get_scheme_names(): """Return a tuple containing the schemes names.""" return tuple(sorted(_INSTALL_SCHEMES)) def get_path_names(): """Return a tuple containing the paths names.""" return _SCHEME_KEYS def get_paths(scheme=get_default_scheme(), vars=None, expand=True): """Return a mapping containing an install scheme. ``scheme`` is the install scheme name. If not provided, it will return the default scheme for the current platform. """ if expand: return _expand_vars(scheme, vars) else: return _INSTALL_SCHEMES[scheme] def get_path(name, scheme=get_default_scheme(), vars=None, expand=True): """Return a path corresponding to the scheme. ``scheme`` is the install scheme name. """ return get_paths(scheme, vars, expand)[name] def get_config_vars(*args): """With no arguments, return a dictionary of all configuration variables relevant for the current platform. On Unix, this means every variable defined in Python's installed Makefile; On Windows it's a much smaller set. With arguments, return a list of values that result from looking up each argument in the configuration variable dictionary. """ global _CONFIG_VARS if _CONFIG_VARS is None: _CONFIG_VARS = {} # Normalized versions of prefix and exec_prefix are handy to have; # in fact, these are the standard versions used most places in the # Distutils. _CONFIG_VARS['prefix'] = _PREFIX _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX _CONFIG_VARS['py_version'] = _PY_VERSION _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT _CONFIG_VARS['py_version_nodot'] = _PY_VERSION_SHORT_NO_DOT _CONFIG_VARS['installed_base'] = _BASE_PREFIX _CONFIG_VARS['base'] = _PREFIX _CONFIG_VARS['installed_platbase'] = _BASE_EXEC_PREFIX _CONFIG_VARS['platbase'] = _EXEC_PREFIX _CONFIG_VARS['projectbase'] = _PROJECT_BASE _CONFIG_VARS['platlibdir'] = sys.platlibdir try: _CONFIG_VARS['abiflags'] = sys.abiflags except AttributeError: # sys.abiflags may not be defined on all platforms. _CONFIG_VARS['abiflags'] = '' try: _CONFIG_VARS['py_version_nodot_plat'] = sys.winver.replace('.', '') except AttributeError: _CONFIG_VARS['py_version_nodot_plat'] = '' if os.name == 'nt': _init_non_posix(_CONFIG_VARS) if os.name == 'posix': _init_posix(_CONFIG_VARS) # For backward compatibility, see issue19555 SO = _CONFIG_VARS.get('EXT_SUFFIX') if SO is not None: _CONFIG_VARS['SO'] = SO if _HAS_USER_BASE: # Setting 'userbase' is done below the call to the # init function to enable using 'get_config_var' in # the init-function. _CONFIG_VARS['userbase'] = _getuserbase() # Always convert srcdir to an absolute path srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE) if os.name == 'posix': if _PYTHON_BUILD: # If srcdir is a relative path (typically '.' or '..') # then it should be interpreted relative to the directory # containing Makefile. base = os.path.dirname(get_makefile_filename()) srcdir = os.path.join(base, srcdir) else: # srcdir is not meaningful since the installation is # spread about the filesystem. We choose the # directory containing the Makefile since we know it # exists. srcdir = os.path.dirname(get_makefile_filename()) _CONFIG_VARS['srcdir'] = _safe_realpath(srcdir) # OS X platforms require special customization to handle # multi-architecture, multi-os-version installers if sys.platform == 'darwin': import _osx_support _osx_support.customize_config_vars(_CONFIG_VARS) if args: vals = [] for name in args: vals.append(_CONFIG_VARS.get(name)) return vals else: return _CONFIG_VARS def get_config_var(name): """Return the value of a single variable using the dictionary returned by 'get_config_vars()'. Equivalent to get_config_vars().get(name) """ if name == 'SO': import warnings warnings.warn('SO is deprecated, use EXT_SUFFIX', DeprecationWarning, 2) return get_config_vars().get(name) def get_platform(): """Return a string that identifies the current platform. This is used mainly to distinguish platform-specific build directories and platform-specific built distributions. Typically includes the OS name and version and the architecture (as supplied by 'os.uname()'), although the exact information included depends on the OS; on Linux, the kernel version isn't particularly important. Examples of returned values: linux-i586 linux-alpha (?) solaris-2.6-sun4u Windows will return one of: win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) win32 (all others - specifically, sys.platform is returned) For other non-POSIX platforms, currently just returns 'sys.platform'. """ if os.name == 'nt': if 'amd64' in sys.version.lower(): return 'win-amd64' if '(arm)' in sys.version.lower(): return 'win-arm32' if '(arm64)' in sys.version.lower(): return 'win-arm64' return sys.platform if os.name != "posix" or not hasattr(os, 'uname'): # XXX what about the architecture? NT is Intel or Alpha return sys.platform # Set for cross builds explicitly if "_PYTHON_HOST_PLATFORM" in os.environ: return os.environ["_PYTHON_HOST_PLATFORM"] # Try to distinguish various flavours of Unix osname, host, release, version, machine = os.uname() # Convert the OS name to lowercase, remove '/' characters, and translate # spaces (for "Power Macintosh") osname = osname.lower().replace('/', '') machine = machine.replace(' ', '_') machine = machine.replace('/', '-') if osname[:5] == "linux": # At least on Linux/Intel, 'machine' is the processor -- # i386, etc. # XXX what about Alpha, SPARC, etc? return f"{osname}-{machine}" elif osname[:5] == "sunos": if release[0] >= "5": # SunOS 5 == Solaris 2 osname = "solaris" release = f"{int(release[0]) - 3}.{release[2:]}" # We can't use "platform.architecture()[0]" because a # bootstrap problem. We use a dict to get an error # if some suspicious happens. bitness = {2147483647:"32bit", 9223372036854775807:"64bit"} machine += f".{bitness[sys.maxsize]}" # fall through to standard osname-release-machine representation elif osname[:3] == "aix": from _aix_support import aix_platform return aix_platform() elif osname[:6] == "cygwin": osname = "cygwin" import re rel_re = re.compile(r'[\d.]+') m = rel_re.match(release) if m: release = m.group() elif osname[:6] == "darwin": import _osx_support osname, release, machine = _osx_support.get_platform_osx( get_config_vars(), osname, release, machine) return f"{osname}-{release}-{machine}" def get_python_version(): return _PY_VERSION_SHORT def expand_makefile_vars(s, vars): """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in 'string' according to 'vars' (a dictionary mapping variable names to values). Variables not present in 'vars' are silently expanded to the empty string. The variable values in 'vars' should not contain further variable expansions; if 'vars' is the output of 'parse_makefile()', you're fine. Returns a variable-expanded version of 's'. """ import re # This algorithm does multiple expansion, so if vars['foo'] contains # "${bar}", it will expand ${foo} to ${bar}, and then expand # ${bar}... and so forth. This is fine as long as 'vars' comes from # 'parse_makefile()', which takes care of such expansions eagerly, # according to make's variable expansion semantics. while True: m = re.search(_findvar1_rx, s) or re.search(_findvar2_rx, s) if m: (beg, end) = m.span() s = s[0:beg] + vars.get(m.group(1)) + s[end:] else: break return s def _print_dict(title, data): for index, (key, value) in enumerate(sorted(data.items())): if index == 0: print(f'{title}: ') print(f'\t{key} = "{value}"') def _main(): """Display all information sysconfig detains.""" if '--generate-posix-vars' in sys.argv: _generate_posix_vars() return print(f'Platform: "{get_platform()}"') print(f'Python version: "{get_python_version()}"') print(f'Current installation scheme: "{get_default_scheme()}"') print() _print_dict('Paths', get_paths()) print() _print_dict('Variables', get_config_vars()) if __name__ == '__main__': _main()
SILENT KILLER Tool