|
from __future__ import annotations |
|
|
|
import codecs |
|
import json |
|
import locale |
|
import os |
|
import platform |
|
import struct |
|
import sys |
|
from typing import TYPE_CHECKING |
|
|
|
if TYPE_CHECKING: |
|
from pandas._typing import JSONSerializable |
|
|
|
from pandas.compat._optional import ( |
|
VERSIONS, |
|
get_version, |
|
import_optional_dependency, |
|
) |
|
|
|
|
|
def _get_commit_hash() -> str | None: |
|
""" |
|
Use vendored versioneer code to get git hash, which handles |
|
git worktree correctly. |
|
""" |
|
try: |
|
from pandas._version_meson import ( |
|
__git_version__, |
|
) |
|
|
|
return __git_version__ |
|
except ImportError: |
|
from pandas._version import get_versions |
|
|
|
versions = get_versions() |
|
return versions["full-revisionid"] |
|
|
|
|
|
def _get_sys_info() -> dict[str, JSONSerializable]: |
|
""" |
|
Returns system information as a JSON serializable dictionary. |
|
""" |
|
uname_result = platform.uname() |
|
language_code, encoding = locale.getlocale() |
|
return { |
|
"commit": _get_commit_hash(), |
|
"python": platform.python_version(), |
|
"python-bits": struct.calcsize("P") * 8, |
|
"OS": uname_result.system, |
|
"OS-release": uname_result.release, |
|
"Version": uname_result.version, |
|
"machine": uname_result.machine, |
|
"processor": uname_result.processor, |
|
"byteorder": sys.byteorder, |
|
"LC_ALL": os.environ.get("LC_ALL"), |
|
"LANG": os.environ.get("LANG"), |
|
"LOCALE": {"language-code": language_code, "encoding": encoding}, |
|
} |
|
|
|
|
|
def _get_dependency_info() -> dict[str, JSONSerializable]: |
|
""" |
|
Returns dependency information as a JSON serializable dictionary. |
|
""" |
|
deps = [ |
|
"pandas", |
|
|
|
"numpy", |
|
"pytz", |
|
"dateutil", |
|
|
|
"pip", |
|
"Cython", |
|
|
|
"sphinx", |
|
|
|
"IPython", |
|
] |
|
|
|
deps.extend(list(VERSIONS)) |
|
|
|
result: dict[str, JSONSerializable] = {} |
|
for modname in deps: |
|
try: |
|
mod = import_optional_dependency(modname, errors="ignore") |
|
except Exception: |
|
|
|
result[modname] = "N/A" |
|
else: |
|
result[modname] = get_version(mod) if mod else None |
|
return result |
|
|
|
|
|
def show_versions(as_json: str | bool = False) -> None: |
|
""" |
|
Provide useful information, important for bug reports. |
|
|
|
It comprises info about hosting operation system, pandas version, |
|
and versions of other installed relative packages. |
|
|
|
Parameters |
|
---------- |
|
as_json : str or bool, default False |
|
* If False, outputs info in a human readable form to the console. |
|
* If str, it will be considered as a path to a file. |
|
Info will be written to that file in JSON format. |
|
* If True, outputs info in JSON format to the console. |
|
|
|
Examples |
|
-------- |
|
>>> pd.show_versions() # doctest: +SKIP |
|
Your output may look something like this: |
|
INSTALLED VERSIONS |
|
------------------ |
|
commit : 37ea63d540fd27274cad6585082c91b1283f963d |
|
python : 3.10.6.final.0 |
|
python-bits : 64 |
|
OS : Linux |
|
OS-release : 5.10.102.1-microsoft-standard-WSL2 |
|
Version : #1 SMP Wed Mar 2 00:30:59 UTC 2022 |
|
machine : x86_64 |
|
processor : x86_64 |
|
byteorder : little |
|
LC_ALL : None |
|
LANG : en_GB.UTF-8 |
|
LOCALE : en_GB.UTF-8 |
|
pandas : 2.0.1 |
|
numpy : 1.24.3 |
|
... |
|
""" |
|
sys_info = _get_sys_info() |
|
deps = _get_dependency_info() |
|
|
|
if as_json: |
|
j = {"system": sys_info, "dependencies": deps} |
|
|
|
if as_json is True: |
|
sys.stdout.writelines(json.dumps(j, indent=2)) |
|
else: |
|
assert isinstance(as_json, str) |
|
with codecs.open(as_json, "wb", encoding="utf8") as f: |
|
json.dump(j, f, indent=2) |
|
|
|
else: |
|
assert isinstance(sys_info["LOCALE"], dict) |
|
language_code = sys_info["LOCALE"]["language-code"] |
|
encoding = sys_info["LOCALE"]["encoding"] |
|
sys_info["LOCALE"] = f"{language_code}.{encoding}" |
|
|
|
maxlen = max(len(x) for x in deps) |
|
print("\nINSTALLED VERSIONS") |
|
print("------------------") |
|
for k, v in sys_info.items(): |
|
print(f"{k:<{maxlen}}: {v}") |
|
print("") |
|
for k, v in deps.items(): |
|
print(f"{k:<{maxlen}}: {v}") |
|
|