#!/usr/bin/env python
import ctypes.util from distutils.sysconfig import get_config_var, get_python_version import os import sys
is_windows = os.name == “nt”
def linked_libpython():
if is_windows: return _linked_libpython_windows() return _linked_libpython_unix()
class Dl_info(ctypes.Structure):
_fields_ = [ ("dli_fname", ctypes.c_char_p), ("dli_fbase", ctypes.c_void_p), ("dli_sname", ctypes.c_char_p), ("dli_saddr", ctypes.c_void_p), ]
def _linked_libpython_unix():
libdl = ctypes.CDLL(ctypes.util.find_library("dl")) libdl.dladdr.argtypes = [ctypes.c_void_p, ctypes.POINTER(Dl_info)] libdl.dladdr.restype = ctypes.c_int dlinfo = Dl_info() retcode = libdl.dladdr( ctypes.cast(ctypes.pythonapi.Py_GetVersion, ctypes.c_void_p), ctypes.pointer(dlinfo)) if retcode == 0: # means error return None path = os.path.realpath(dlinfo.dli_fname.decode()) if path == os.path.realpath(sys.executable): return None return path
def _linked_libpython_windows():
# Based on: https://stackoverflow.com/a/16659821 from ctypes.wintypes import HANDLE, LPWSTR, DWORD GetModuleFileName = ctypes.windll.kernel32.GetModuleFileNameW GetModuleFileName.argtypes = [HANDLE, LPWSTR, DWORD] GetModuleFileName.restype = DWORD MAX_PATH = 260 try: buf = ctypes.create_unicode_buffer(MAX_PATH) GetModuleFileName(ctypes.pythonapi._handle, buf, MAX_PATH) return buf.value except (ValueError, OSError): return None
print(“linked_libpython: {val}”.format(val=(linked_libpython() or “None”)))
sys_keys = [ “executable”, “exec_prefix”, “prefix” ]
for var in sys_keys:
print("{var}: {val}".format(var=var, val=(getattr(sys, var) or "None")))
config_keys = [ “INSTSONAME”, “LIBDIR”, “LIBPL”, “LIBRARY”, “LDLIBRARY”,
"MULTIARCH", "PYTHONFRAMEWORKPREFIX", "SHLIB_SUFFIX", "srcdir" ]
for var in config_keys:
print("{var}: {val}".format(var=var, val=(get_config_var(var) or "None")))
print(“ABIFLAGS: {val}”.format(val=get_config_var(“ABIFLAGS”) or get_config_var(“abiflags”) or “None”))
version = get_python_version() or \
"{v.major}.{v.minor}".format(v=sys.version_info) or \ get_config_var("VERSION")
print(“VERSION: {val}”.format(val=version))
if is_windows:
if hasattr(sys, "base_exec_prefix"): PYTHONHOME = sys.base_exec_prefix else: PYTHONHOME = sys.exec_prefix
else:
if hasattr(sys, "base_exec_prefix"): PYTHONHOME = ":".join([sys.base_prefix, sys.base_exec_prefix]) else: PYTHONHOME = ":".join([sys.prefix, sys.exec_prefix])
print(“PYTHONHOME: {val}”.format(val=PYTHONHOME))