2024-09-25 20:22:46 +04:00

111 lines
3.1 KiB
Python

#!/usr/bin/env python
"""
display environment information that is frequently
used to troubleshoot installations of Jupyter or IPython
"""
from __future__ import annotations
import os
import platform
import subprocess
import sys
from typing import Any, Optional, Union
def subs(cmd: Union[list[str], str]) -> Optional[str]:
"""
get data from commands that we need to run outside of python
"""
try:
stdout = subprocess.check_output(cmd) # noqa: S603
return stdout.decode("utf-8", "replace").strip()
except (OSError, subprocess.CalledProcessError):
return None
def get_data() -> dict[str, Any]:
"""
returns a dict of various user environment data
"""
env: dict[str, Any] = {}
env["path"] = os.environ.get("PATH")
env["sys_path"] = sys.path
env["sys_exe"] = sys.executable
env["sys_version"] = sys.version
env["platform"] = platform.platform()
# FIXME: which on Windows?
if sys.platform == "win32":
env["where"] = subs(["where", "jupyter"])
env["which"] = None
else:
env["which"] = subs(["which", "-a", "jupyter"])
env["where"] = None
env["pip"] = subs([sys.executable, "-m", "pip", "list"])
env["conda"] = subs(["conda", "list"])
env["conda-env"] = subs(["conda", "env", "export"])
return env
def main() -> None:
"""
print out useful info
"""
# pylint: disable=superfluous-parens
# args = get_args()
if "_ARGCOMPLETE" in os.environ:
# No arguments to complete, the script can be slow to run to completion,
# so in case someone tries to complete jupyter troubleshoot just exit early
return
environment_data = get_data()
print("$PATH:")
for directory in environment_data["path"].split(os.pathsep):
print(f"\t{directory}")
print("\nsys.path:")
for directory in environment_data["sys_path"]:
print(f"\t{directory}")
print("\nsys.executable:")
print(f'\t{environment_data["sys_exe"]}')
print("\nsys.version:")
if "\n" in environment_data["sys_version"]:
for data in environment_data["sys_version"].split("\n"):
print(f"\t{data}")
else:
print(f'\t{environment_data["sys_version"]}')
print("\nplatform.platform():")
print(f'\t{environment_data["platform"]}')
if environment_data["which"]:
print("\nwhich -a jupyter:")
for line in environment_data["which"].split("\n"):
print(f"\t{line}")
if environment_data["where"]:
print("\nwhere jupyter:")
for line in environment_data["where"].split("\n"):
print(f"\t{line}")
if environment_data["pip"]:
print("\npip list:")
for package in environment_data["pip"].split("\n"):
print(f"\t{package}")
if environment_data["conda"]:
print("\nconda list:")
for package in environment_data["conda"].split("\n"):
print(f"\t{package}")
if environment_data["conda-env"]:
print("\nconda env:")
for package in environment_data["conda-env"].split("\n"):
print(f"\t{package}")
if __name__ == "__main__":
main()