Package mvpa :: Package base :: Module info
[hide private]
[frames] | no frames]

Source Code for Module mvpa.base.info

  1  # emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- 
  2  # vi: set ft=python sts=4 ts=4 sw=4 et: 
  3  ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## 
  4  # 
  5  #   See COPYING file distributed along with the PyMVPA package for the 
  6  #   copyright and license terms. 
  7  # 
  8  ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## 
  9  """Provide system and PyMVPA information useful while reporting bugs 
 10  """ 
 11   
 12  __docformat__ = 'restructuredtext' 
 13   
 14  import time, sys, os, subprocess 
 15  import platform as pl 
 16  from tempfile import mkstemp 
 17  from StringIO import StringIO 
 18   
 19  import mvpa 
 20  from mvpa.base import externals, cfg 
 21   
22 -def _t2s(t):
23 res = [] 24 for e in t: 25 if isinstance(e, tuple): 26 es = _t2s(e) 27 if es != '': 28 res += ['(%s)' % es] 29 elif e != '': 30 res += [e] 31 return '/'.join(res)
32 33 __all__ = ['wtf'] 34
35 -class WTF(object):
36 """Convenience class to contain information about PyMVPA and OS 37 38 TODO: refactor to actually not contain just string representation 39 but rather a dictionary (of dictionaries) 40 """ 41
42 - def __init__(self):
43 self._info = '' 44 self._acquire()
45
46 - def _acquire(self):
47 """ 48 TODO: refactor and redo ;) 49 """ 50 out = StringIO() 51 52 out.write("Current date: %s\n" % time.strftime("%Y-%m-%d %H:%M")) 53 54 out.write("PyMVPA:\n") 55 out.write(" Version: %s\n" % mvpa.__version__) 56 out.write(" Path: %s\n" % mvpa.__file__) 57 58 # Try to obtain git information if available 59 out.write(" Version control (GIT):\n") 60 try: 61 gitpath = os.path.join(os.path.dirname(mvpa.__file__), os.path.pardir) 62 gitpathgit = os.path.join(gitpath, '.git') 63 if os.path.exists(gitpathgit): 64 for scmd, cmd in [ 65 ('Status', ['status']), 66 ('Reference', 'show-ref -h HEAD'.split(' ')), 67 ('Difference from last release %s' % mvpa.__version__, 68 ['diff', '--shortstat', 'upstream/%s...' % mvpa.__version__])]: 69 try: 70 (tmpd, tmpn) = mkstemp('mvpa', 'git') 71 retcode = subprocess.call(['git', 72 '--git-dir=%s' % gitpathgit, 73 '--work-tree=%s' % gitpath] + cmd, 74 stdout=tmpd, 75 stderr=subprocess.STDOUT) 76 finally: 77 outlines = open(tmpn, 'r').readlines() 78 if len(outlines): 79 out.write(' %s:\n %s' % (scmd, ' '.join(outlines))) 80 os.remove(tmpn) 81 #except Exception, e: 82 # pass 83 else: 84 raise RuntimeError, "%s is not under GIT" % gitpath 85 except Exception, e: 86 out.write(' GIT information could not be obtained due "%s"\n' % e) 87 88 out.write('SYSTEM:\n') 89 out.write(' OS: %s\n' % 90 ' '.join([os.name, 91 pl.system(), 92 pl.release(), 93 pl.version()]).rstrip()) 94 out.write(' Distribution: %s\n' % 95 ' '.join([_t2s(pl.dist()), 96 _t2s(pl.mac_ver()), 97 _t2s(pl.win32_ver())]).rstrip()) 98 99 # Test and list all dependencies: 100 sdeps = {True: [], False: []} 101 for dep in sorted(externals._KNOWN): 102 sdeps[externals.exists(dep, force=False)] += [dep] 103 out.write('EXTERNALS:\n') 104 out.write(' Present: %s\n' % ', '.join(sdeps[True])) 105 out.write(' Absent: %s\n' % ', '.join(sdeps[False])) 106 107 SV = ('.__version__', ) # standard versioning 108 out.write(' Versions of critical externals:\n') 109 for e, mname, fs in ( 110 ('ctypes', None, SV), 111 ('matplotlib', None, SV), 112 ('lxml', None, ('.etree.__version__',)), 113 ('nifti', None, SV), 114 ('numpy', None, SV), 115 ('openopt', 'openopt', SV), 116 ('openopt', 'scikits.openopt', ('.openopt.__version__',)), 117 ('pywt', None, SV), 118 ('rpy', None, ('.rpy_version',)), 119 ('scipy', None, SV), 120 ('shogun', None, ('.Classifier.Version_get_version_release()',)), 121 ): 122 try: 123 if not externals.exists(e): 124 continue #sver = 'not present' 125 else: 126 if mname is None: 127 mname = e 128 m = __import__(mname) 129 svers = [eval('m%s' % (f,)) for f in fs] 130 sver = ' '.join(svers) 131 except Exception, exc: 132 sver = 'failed to query due to "%s"' % str(exc) 133 out.write(' %-12s: %s\n' % (e, sver)) 134 135 if externals.exists('matplotlib'): 136 import matplotlib 137 out.write(' Matplotlib backend: %s\n' % matplotlib.get_backend()) 138 139 out.write("RUNTIME:\n") 140 out.write(" PyMVPA Environment Variables:\n") 141 out.write(' '.join([' %-20s: "%s"\n' % (str(k), str(v)) 142 for k, v in os.environ.iteritems() 143 if (k.startswith('MVPA') or k.startswith('PYTHON'))])) 144 145 out.write(" PyMVPA Runtime Configuration:\n") 146 out.write(' ' + str(cfg).replace('\n', '\n ').rstrip() + '\n') 147 148 try: 149 procstat = open('/proc/%d/status' % os.getpid()).readlines() 150 out.write(' Process Information:\n') 151 out.write(' ' + ' '.join(procstat)) 152 except: 153 pass 154 155 self._info = out.getvalue()
156
157 - def __repr__(self):
158 if self._info is None: 159 self._acquire() 160 return self._info
161 162 __str__ = __repr__
163 164
165 -def wtf(filename=None):
166 """Report summary about PyMVPA and the system 167 168 :Keywords: 169 filename : None or string 170 If provided, information will be stored in a file, not printed 171 to the screen 172 """ 173 174 info = WTF() 175 if filename is not None: 176 out = file(filename, 'w').write(str(info)) 177 else: 178 return info
179 180 181 if __name__ == '__main__': 182 print wtf() 183