111 lines
3.1 KiB
Python
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()
|