Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1import codecs 

2import json 

3import locale 

4import os 

5import platform 

6import struct 

7import subprocess 

8import sys 

9from typing import List, Optional, Tuple, Union 

10 

11from pandas.compat._optional import VERSIONS, _get_version, import_optional_dependency 

12 

13 

14def get_sys_info() -> List[Tuple[str, Optional[Union[str, int]]]]: 

15 """ 

16 Returns system information as a list 

17 """ 

18 blob: List[Tuple[str, Optional[Union[str, int]]]] = [] 

19 

20 # get full commit hash 

21 commit = None 

22 if os.path.isdir(".git") and os.path.isdir("pandas"): 

23 try: 

24 pipe = subprocess.Popen( 

25 'git log --format="%H" -n 1'.split(" "), 

26 stdout=subprocess.PIPE, 

27 stderr=subprocess.PIPE, 

28 ) 

29 so, serr = pipe.communicate() 

30 except (OSError, ValueError): 

31 pass 

32 else: 

33 if pipe.returncode == 0: 

34 commit = so.decode("utf-8").strip().strip('"') 

35 

36 blob.append(("commit", commit)) 

37 

38 try: 

39 (sysname, nodename, release, version, machine, processor) = platform.uname() 

40 blob.extend( 

41 [ 

42 ("python", ".".join(map(str, sys.version_info))), 

43 ("python-bits", struct.calcsize("P") * 8), 

44 ("OS", f"{sysname}"), 

45 ("OS-release", f"{release}"), 

46 # ("Version", "{version}".format(version=version)), 

47 ("machine", f"{machine}"), 

48 ("processor", f"{processor}"), 

49 ("byteorder", f"{sys.byteorder}"), 

50 ("LC_ALL", f"{os.environ.get('LC_ALL', 'None')}"), 

51 ("LANG", f"{os.environ.get('LANG', 'None')}"), 

52 ("LOCALE", ".".join(map(str, locale.getlocale()))), 

53 ] 

54 ) 

55 except (KeyError, ValueError): 

56 pass 

57 

58 return blob 

59 

60 

61def show_versions(as_json=False): 

62 sys_info = get_sys_info() 

63 deps = [ 

64 "pandas", 

65 # required 

66 "numpy", 

67 "pytz", 

68 "dateutil", 

69 # install / build, 

70 "pip", 

71 "setuptools", 

72 "Cython", 

73 # test 

74 "pytest", 

75 "hypothesis", 

76 # docs 

77 "sphinx", 

78 # Other, need a min version 

79 "blosc", 

80 "feather", 

81 "xlsxwriter", 

82 "lxml.etree", 

83 "html5lib", 

84 "pymysql", 

85 "psycopg2", 

86 "jinja2", 

87 # Other, not imported. 

88 "IPython", 

89 "pandas_datareader", 

90 ] 

91 

92 deps.extend(list(VERSIONS)) 

93 deps_blob = [] 

94 

95 for modname in deps: 

96 mod = import_optional_dependency( 

97 modname, raise_on_missing=False, on_version="ignore" 

98 ) 

99 ver: Optional[str] 

100 if mod: 

101 ver = _get_version(mod) 

102 else: 

103 ver = None 

104 deps_blob.append((modname, ver)) 

105 

106 if as_json: 

107 j = dict(system=dict(sys_info), dependencies=dict(deps_blob)) 

108 

109 if as_json is True: 

110 print(j) 

111 else: 

112 with codecs.open(as_json, "wb", encoding="utf8") as f: 

113 json.dump(j, f, indent=2) 

114 

115 else: 

116 maxlen = max(len(x) for x in deps) 

117 tpl = "{{k:<{maxlen}}}: {{stat}}".format(maxlen=maxlen) 

118 print("\nINSTALLED VERSIONS") 

119 print("------------------") 

120 for k, stat in sys_info: 

121 print(tpl.format(k=k, stat=stat)) 

122 print("") 

123 for k, stat in deps_blob: 

124 print(tpl.format(k=k, stat=stat)) 

125 

126 

127def main() -> int: 

128 from optparse import OptionParser 

129 

130 parser = OptionParser() 

131 parser.add_option( 

132 "-j", 

133 "--json", 

134 metavar="FILE", 

135 nargs=1, 

136 help="Save output as JSON into file, pass in '-' to output to stdout", 

137 ) 

138 

139 (options, args) = parser.parse_args() 

140 

141 if options.json == "-": 

142 options.json = True 

143 

144 show_versions(as_json=options.json) 

145 

146 return 0 

147 

148 

149if __name__ == "__main__": 

150 sys.exit(main())