J2897 icon

python_info

J2897 | PRO | 09/04/24 08:33:08 AM UTC (Edited) | 0 ⭐ | 601 👁️ | Never ⏰ | []
Python |

7.41 KB

|

None

|

0 👍

/

0 👎

import os
import sys
import subprocess
import winreg
import platform
 
"""
    How to use:
 
    Save this as a `python_info.py` file and run it using Python.
 
    There are various ways to run Python scripts on Windows. When your
    Python installations are conflicting, or have been messed up, some
    methods may work, and others may not.
 
    * Method 1: `python_info.py` assumes that the Python executable is in
    the system's PATH and that the script has a shebang line (`#! python`)
    or is associated with the Python executable (*.py).
 
    * Method 2: `python python_info.py` explicitly calls the Python
    executable, which is useful if the script doesn't have a shebang line
    or isn't associated with the Python executable (*.py).
 
    * Method 3: `py python_info.py` uses the `py` launcher, which is a part
    of the Python for Windows installation. It allows you to easily run
    Python scripts without specifying the full path to the Python
    executable.
 
    * Method 4: `py -3.10 python_info.py` and `py -3.9 python_info.py` use
    the `py` launcher to specify a particular version of Python to use.
 
    Running this script using any method may help you fix a broken Python
    installation.
"""
 
def run_command(command):
    """Executes a shell command and returns the output or error message."""
    try:
        result = subprocess.run(command, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        return result.stdout.strip()
    except subprocess.CalledProcessError as e:
        return f"Error: {e.stderr.strip()}"
 
def display_list(title, items):
    """Displays a list of items with a title, formatted for readability."""
    print(f"{title}:\n")
    if isinstance(items, list):
        for item in items:
            print(f"  - {item}")
    else:
        print(f"  {items}")
    print()
 
def check_registry_paths(base_key, sub_key, base_key_name):
    """Checks specified registry paths for installed Python versions."""
    python_paths = []
    try:
        with winreg.OpenKey(base_key, sub_key) as key:
            i = 0
            while True:
                try:
                    version = winreg.EnumKey(key, i)
                    with winreg.OpenKey(key, f"{version}\\InstallPath") as subkey:
                        python_path = winreg.QueryValue(subkey, "")
                        python_paths.append(f"Version {version}: {python_path}")
                    i += 1
                except OSError:
                    break
    except PermissionError:
        python_paths.append(f"Access denied to {base_key_name}. Consider running as Administrator.")
    except FileNotFoundError:
        python_paths.append(f"No Python installations found in {base_key_name}.")
    except Exception as e:
        python_paths.append(f"Error accessing {base_key_name}: {str(e)}")
    return python_paths
 
def display_install_locations():
    """Displays the install locations for Python, py launcher, and pip."""
    python_locations = run_command("where python" if os.name == 'nt' else "which python").splitlines()
    py_location = run_command("where py" if os.name == 'nt' else "which py").splitlines()
    pip_locations = run_command("where pip" if os.name == 'nt' else "which pip").splitlines()
 
    display_list("Install Locations", 
                 [f"[PYTHON] {loc}" for loc in python_locations] + 
                 [f"[PIP] {loc}" for loc in pip_locations] +
                 [f"[PY] {loc}" for loc in py_location])
 
def display_env_variables():
    """Displays key Python-related environment variables."""
    display_list("PYTHONPATH", os.environ.get('PYTHONPATH', 'Not Set'))
    display_list("PY_PYTHON", os.environ.get('PY_PYTHON', 'Not Set'))
    display_list("PY_PYTHON3", os.environ.get('PY_PYTHON3', 'Not Set'))
 
def main():
    print("="*60)
    print("Python Environment Information")
    print("="*60, "\n")
 
    # Get Python version
    python_version = run_command(f'{sys.executable} -c "import sys; print(sys.version)"')
    display_list("Python Version", python_version)
 
    # Get Python build and compiler information
    python_build = run_command(f'{sys.executable} -c "import sys; print(sys.version_info[:])"')
    display_list("Python Version Info", python_build)
 
    # Display install locations
    display_install_locations()
 
    # Display environment details
    print("="*60)
    print("Packages Installed")
    print("="*60, "\n")
 
    # Get paths for site-packages
    user_site_packages = run_command(f'{sys.executable} -c "import site; print(site.getusersitepackages())"')
    global_site_packages = run_command(f'{sys.executable} -c "import site; print(site.getsitepackages())"')
 
    # Display user-installed packages
    print("[USER]")
    print(run_command(f'{sys.executable} -m pip list --user'))
    print(f"\nUser Site-Packages Location: {user_site_packages}\n")
 
    # Display globally installed packages
    print("[GLOBAL]")
    print(run_command(f'{sys.executable} -m pip list --local'))
    print()  # Add an empty line before Global Site-Packages Locations
    display_list("Global Site-Packages Locations", eval(global_site_packages))
 
    # Check for outdated packages
    print("Outdated Packages:")
    outdated = run_command(f'{sys.executable} -m pip list --outdated')
    print(outdated if outdated else "No outdated packages found.")
    print()
 
    # Display environment details
    print("="*60)
    print("Environment Details")
    print("="*60, "\n")
 
    # Display current working directory
    display_list("Current Working Directory", os.getcwd())
 
    # Display more information about the Python executable
    executable_info = run_command(f'{sys.executable} -c "import platform; print(platform.python_implementation(), platform.python_version())"')
    display_list("Python Executable Information", [sys.executable, executable_info])
 
    # Check if running in a virtual environment
    venv = os.environ.get('VIRTUAL_ENV', 'Not in a virtual environment')
    display_list("Virtual Environment", venv)
 
    # Display environment variables
    display_env_variables()
 
    # Display PATH with numbering
    path_items = list(filter(None, os.environ.get('PATH', '').split(os.pathsep)))
    print("PATH:\n")
    for idx, path in enumerate(path_items, start=1):
        print(f"  [{idx}] {path}")
    print()
 
    # Display sys.path
    print("Python Module Search Paths:")
    print()
    for idx, path in enumerate(sys.path, start=1):
        print(f"  [{idx}] {path}")
    print()
 
    # Check Python installations in registry
    print("="*60)
    print("Python Installations in Registry")
    print("="*60, "\n")
    user_key = winreg.HKEY_CURRENT_USER
    machine_key = winreg.HKEY_LOCAL_MACHINE
    sub_key = r"Software\Python\PythonCore"
 
    # Check both HKEY_CURRENT_USER and HKEY_LOCAL_MACHINE
    display_list("HKEY_CURRENT_USER", check_registry_paths(user_key, sub_key, "HKEY_CURRENT_USER"))
    display_list("HKEY_LOCAL_MACHINE", check_registry_paths(machine_key, sub_key, "HKEY_LOCAL_MACHINE"))
 
    print("\nRecommendations:")
    print("1. Ensure the desired Python version is prioritized in the PATH.")
    print("2. Use 'py -X.Y' to target specific Python versions if multiple are installed.")
    print("3. Consider repairing Python installations via the installer if inconsistencies are found.")
 
if __name__ == "__main__":
    main()

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎