1
0

_print_versions.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import codecs
  2. import json
  3. import locale
  4. import os
  5. import platform
  6. import struct
  7. import subprocess
  8. import sys
  9. from typing import List, Optional, Tuple, Union
  10. from pandas.compat._optional import VERSIONS, _get_version, import_optional_dependency
  11. def get_sys_info() -> List[Tuple[str, Optional[Union[str, int]]]]:
  12. """
  13. Returns system information as a list
  14. """
  15. blob: List[Tuple[str, Optional[Union[str, int]]]] = []
  16. # get full commit hash
  17. commit = None
  18. if os.path.isdir(".git") and os.path.isdir("pandas"):
  19. try:
  20. pipe = subprocess.Popen(
  21. 'git log --format="%H" -n 1'.split(" "),
  22. stdout=subprocess.PIPE,
  23. stderr=subprocess.PIPE,
  24. )
  25. so, serr = pipe.communicate()
  26. except (OSError, ValueError):
  27. pass
  28. else:
  29. if pipe.returncode == 0:
  30. commit = so.decode("utf-8").strip().strip('"')
  31. blob.append(("commit", commit))
  32. try:
  33. (sysname, nodename, release, version, machine, processor) = platform.uname()
  34. blob.extend(
  35. [
  36. ("python", ".".join(map(str, sys.version_info))),
  37. ("python-bits", struct.calcsize("P") * 8),
  38. ("OS", f"{sysname}"),
  39. ("OS-release", f"{release}"),
  40. # ("Version", "{version}".format(version=version)),
  41. ("machine", f"{machine}"),
  42. ("processor", f"{processor}"),
  43. ("byteorder", f"{sys.byteorder}"),
  44. ("LC_ALL", f"{os.environ.get('LC_ALL', 'None')}"),
  45. ("LANG", f"{os.environ.get('LANG', 'None')}"),
  46. ("LOCALE", ".".join(map(str, locale.getlocale()))),
  47. ]
  48. )
  49. except (KeyError, ValueError):
  50. pass
  51. return blob
  52. def show_versions(as_json=False):
  53. sys_info = get_sys_info()
  54. deps = [
  55. "pandas",
  56. # required
  57. "numpy",
  58. "pytz",
  59. "dateutil",
  60. # install / build,
  61. "pip",
  62. "setuptools",
  63. "Cython",
  64. # test
  65. "pytest",
  66. "hypothesis",
  67. # docs
  68. "sphinx",
  69. # Other, need a min version
  70. "blosc",
  71. "feather",
  72. "xlsxwriter",
  73. "lxml.etree",
  74. "html5lib",
  75. "pymysql",
  76. "psycopg2",
  77. "jinja2",
  78. # Other, not imported.
  79. "IPython",
  80. "pandas_datareader",
  81. ]
  82. deps.extend(list(VERSIONS))
  83. deps_blob = []
  84. for modname in deps:
  85. mod = import_optional_dependency(
  86. modname, raise_on_missing=False, on_version="ignore"
  87. )
  88. ver: Optional[str]
  89. if mod:
  90. ver = _get_version(mod)
  91. else:
  92. ver = None
  93. deps_blob.append((modname, ver))
  94. if as_json:
  95. j = dict(system=dict(sys_info), dependencies=dict(deps_blob))
  96. if as_json is True:
  97. print(j)
  98. else:
  99. with codecs.open(as_json, "wb", encoding="utf8") as f:
  100. json.dump(j, f, indent=2)
  101. else:
  102. maxlen = max(len(x) for x in deps)
  103. tpl = "{{k:<{maxlen}}}: {{stat}}".format(maxlen=maxlen)
  104. print("\nINSTALLED VERSIONS")
  105. print("------------------")
  106. for k, stat in sys_info:
  107. print(tpl.format(k=k, stat=stat))
  108. print("")
  109. for k, stat in deps_blob:
  110. print(tpl.format(k=k, stat=stat))
  111. def main() -> int:
  112. from optparse import OptionParser
  113. parser = OptionParser()
  114. parser.add_option(
  115. "-j",
  116. "--json",
  117. metavar="FILE",
  118. nargs=1,
  119. help="Save output as JSON into file, pass in '-' to output to stdout",
  120. )
  121. (options, args) = parser.parse_args()
  122. if options.json == "-":
  123. options.json = True
  124. show_versions(as_json=options.json)
  125. return 0
  126. if __name__ == "__main__":
  127. sys.exit(main())