_print_versions.py 5.1 KB

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