def show_comments(self): # check for a good result, first if len(self.comments) == 0: print(UTIL.section_divider(' nothing to fix, yay! ', hchar='=')) print('') return print(UTIL.section_divider(' summary, please fix: ', hchar='=')) for cc in self.comments: if len(cc) == 0: print('') else: if cc[0] == ' ': print(' %s' % cc) else: print('* %s' % cc) print('')
def show_python_lib_info(self, header=1): # any extra libs to test beyone main ones extralibs = ['matplotlib.pyplot'] verb = 3 if header: print(UTIL.section_divider('python libs', hchar='-')) # itemize special libraries to test: PyQt4 self.test_python_lib_pyqt4(verb=verb) print('') # then go after any others for plib in extralibs: self.test_python_lib(plib, verb=verb) print('') for rootdir in ['/sw/bin', '/usr/local/bin']: # hard to avoid related files, so search for expected names pdirs = glob.glob('%s/python' % rootdir) p1dirs = glob.glob('%s/python[0-9]' % rootdir) p2dirs = glob.glob('%s/python[0-9].[0-9]' % rootdir) pdirs.extend(p1dirs) pdirs.extend(p2dirs) if len(pdirs) > 0: print('-- python binaries under %s:' % rootdir) for pdir in pdirs: if os.path.islink(pdir): rstr = ' (sym link to %s)' % os.path.realpath(pdir) else: rstr = '' print(' %-20s%s' % (pdir, rstr)) print('')
def show_general_sys_info(self, header=1): if header: print(UTIL.section_divider('general', hchar='-')) print('architecture: %s' % tup_str(platform.architecture())) print('system: %s' % platform.system()) print('release: %s' % platform.release()) print('version: %s' % platform.version()) # check distributions by type - now all over the place self.os_dist = distribution_string() # save for later print('distribution: %s' % self.os_dist) print('number of CPUs: %s' % self.get_cpu_count()) # note shell, and if we are not in login shell logshell = UTIL.get_login_shell() curshell = UTIL.get_current_shell() if logshell == curshell: note = '' else: note = ' (current shell is %s)' % curshell if logshell not in ['csh', 'tcsh']: self.comments.append("login shell '%s', trusting user to translate" \ " code examples from 'tcsh'" % logshell) print('apparent login shell: %s%s' % (logshell, note)) self.cur_shell = curshell self.login_shell = logshell self.set_shell_rc_file([logshell, curshell]) if self.home_file_exists(self.rc_file): fstr = 'exists' else: fstr = 'does not exist' print('shell RC file: %s (%s)' % (self.rc_file, fstr)) print('')
def show_function_help(flist): from afnipy import afni_util as UTIL for func in flist: print(UTIL.section_divider('help for: %s' % func)) try: fn = eval(func) print(fn.__doc__) except: print("** not a valid function '%s'" % func)
def show_data_info(self, header=1): """checks that are specific to data - class data existence and tree root - assume $HOME if not found - disk space under data root - maybe check for mounted file system - atlases (maybe just @Find TT_N27+tlrc?) """ if header: print(UTIL.section_divider('data checks', hchar='-')) # locate various data trees, and possibly show recent history rv = 0 rv += self.show_data_dir_info('AFNI_data6', 'history.txt') rv += self.show_data_dir_info('AFNI_demos', 'history.txt') rv += self.show_data_dir_info('suma_demo', 'README.archive_creation') rv += self.show_data_dir_info('afni_handouts') if rv: self.comments.append('insufficient data for AFNI bootcamp') evar = 'AFNI_ATLAS_DIR' tryenv = 0 # might suggest setting evar haveenv = evar in os.environ if haveenv: edir = os.environ[evar] else: edir = '' # look for atlases in multiple directories atlas = 'TT_N27+tlrc' if os.path.isfile('%s/%s.HEAD'%(edir,atlas)): glist = [edir] else: glist = [] cmd = '@FindAfniDsetPath %s' % atlas s, so, se = UTIL.limited_shell_exec(cmd, nlines=1) if s: tryenv = 1 # failed elif len(so) > 0: glist.append(so[0]) for ddir in ['/usr/share/afni/atlases', '/usr/local/afni/atlases']: if os.path.isfile('%s/%s.HEAD'%(ddir,atlas)): glist.append(ddir) if tryenv: self.comments.append('consider setting %s to %s' % (evar,ddir)) # fix to work with found after the fact glist = UTIL.get_unique_sublist(glist) if len(glist) == 0: print('atlas : did not find %s' % atlas) self.comments.append('possibly missing atlases') else: for ddir in glist: print('atlas : found %-12s under %s' % (atlas, ddir)) if haveenv: print("\natlas var: %s = %s" % (evar, edir)) print('')
def show_os_specific(self, header=1): """checks that are specific to one OS or another""" if self.system not in ['Linux', 'Darwin']: return if header: print(UTIL.section_divider('OS specific', hchar='-')) if self.system == 'Linux': self.show_spec_linux() elif self.system == 'Darwin': self.show_spec_osx() print('')
def show_path_vars(self, header=1): print(UTIL.section_divider('env vars', hchar='-')) for evar in ['PATH', 'PYTHONPATH', 'R_LIBS', 'LD_LIBRARY_PATH', 'DYLD_LIBRARY_PATH', 'DYLD_FALLBACK_LIBRARY_PATH']: if evar in os.environ: print("%s = %s\n" % (evar, os.environ[evar])) elif evar.startswith('DY') and self.get_osx_ver() >= 11: s, so = self.get_shell_value(self.cur_shell, evar) print("%s (sub-shell) = %s" % (evar, so)) else: print("%s = " % evar) print('')
def check_dotfiles(self, show=0, pack=0): global g_dotfiles home = os.environ['HOME'] # get list of existing files dfound = [] for dfile in g_dotfiles: if os.path.isfile('%s/%s' % (home, dfile)): dfound.append(dfile) print('found under $HOME : %s' % dfile) if show: for dfile in dfound: print(UTIL.section_divider(dfile, hchar='=')) print('%s\n' % UTIL.read_text_file('%s/%s' % (home, dfile), lines=0)) if pack: import shutil package = self.dot_file_pack pgz = '%s.tgz' % package # maybe user included the extension ext = package.find('.tgz') if ext >= 0: pgz = package package = package[0:ext] if os.path.exists(package) or os.path.exists('%s.tgz' % package): print("** error: package dir '%s' or file '%s' already exists"\ % (package, pgz)) return 1 try: os.mkdir(package) except: print("** failed to make dot file package dir '%s'" % package) return 1 for dfile in dfound: shutil.copy2('%s/%s' % (home, dfile), package) os.system("tar cfz %s %s" % (pgz, package)) shutil.rmtree(package) if os.path.exists(pgz): print('++ dot file package is in %s' % pgz) else: print('** failed to make dot file packge %s' % pgz) return 0
def show_env_vars(self, header=1): print(UTIL.section_divider('env vars', hchar='-')) for evar in ['PATH', 'PYTHONPATH', 'R_LIBS', 'LD_LIBRARY_PATH', 'DYLD_LIBRARY_PATH', 'DYLD_FALLBACK_LIBRARY_PATH']: if evar in os.environ: if self.verb > 2: print("-- SEV: getting var from current env ...") print("%s = %s\n" % (evar, os.environ[evar])) elif evar.startswith('DY') and self.get_osx_ver() >= 11: if self.verb > 2: print("-- SEV: get DY var from macos child env (cur shell)...") s, so = self.get_shell_value(self.cur_shell, evar) print("%s (sub-shell) = %s" % (evar, so)) else: if self.verb > 2: print("-- SEV: env var not set ...") print("%s = " % evar) print('') self.check_for_bash_complete_under_zsh()
def process_args(): argv = sys.argv if '-help' in argv or len(argv) < 2: print(_g_main_help) return 0 global argbase # ------------------------------------------------------------ # main module has already been imported in global scope # ------------------------------------------------------------ if argv[argbase] == '-eval': eval(' '.join(argv[argbase+1:])) return 0 elif argv[argbase] == '-exec': exec(' '.join(argv[argbase+1:])) return 0 elif argv[argbase] == '-funchelp': from afnipy import afni_util as UTIL for func in argv[argbase+1:]: print(UTIL.section_divider('help for: %s' % func)) try: fn = eval(func) print(fn.__doc__) except: print("** not a valid function '%s'" % func) # show_function_help(argv[argbase+1:]) return 0 elif argv[argbase] == '-lprint': ret = eval(' '.join(argv[argbase+1:])) print('\n'.join(['%s'%rent for rent in ret])) return 0 elif argv[argbase] == '-print': print(eval(' '.join(argv[argbase+1:]))) return 0 elif argv[argbase] == '-listfunc': return process_listfunc(argv, argbase) else: print('** please see "afni_python_wrapper.py -help" for usage') return 1
def show_general_afni_info(self, header=1): print(UTIL.section_divider('AFNI and related program tests', hchar='-')) self.afni_dir = self.get_afni_dir() check_list = ['afni', 'afni label', 'AFNI_version.txt', 'python', 'R', 'tcsh'] nfound = self.check_for_progs(check_list, show_missing=1) if nfound < len(check_list): self.comments.append('failure under initial ' \ '"AFNI and related program tests"') # make generic but pretty print("instances of various programs found in PATH:") proglist = ['afni', 'R', 'python', 'python2', 'python3'] ml = UTIL.max_len_in_list(proglist) for prog in proglist: rv, files = UTIL.search_path_dirs(prog, mtype=1) if not rv: if len(files) > 1: fstr = '\n '+'\n '.join(files) elif len(files) > 0: fstr = ' (%s)' % files[0] else: fstr = '' print(' %-*s : %d %s' % (ml, prog, len(files), fstr)) if prog == 'afni': if len(files) > 1: self.comments.append("have multiple versions of AFNI in PATH") if len(files) > 0: if os.stat(files[0]).st_uid == 0: self.comments.append("'afni' executable is owned by root") print('') # explicit python2 vs python3 check 7 Dec 2016 n2 = UTIL.num_found_in_path('python2', mtype=1) n3 = UTIL.num_found_in_path('python3', mtype=1) if n3 > 0 and n2 <= 0: print("** have python3 but not python2") print('') # try select AFNI programs print('testing ability to start various programs...') ind = '%8s' % ' ' indn = '\n%8s' % ' ' proglist = ['afni', 'suma', '3dSkullStrip', 'uber_subject.py', '3dAllineate', '3dRSFC', 'SurfMesh', '3dClustSim', '3dMVM'] fcount = 0 for prog in proglist: st, so, se = BASE.shell_exec2('%s -help'%prog, capture=1) # if 3dMVM, status will be 0 on failed library load (fix that, too) if prog == '3dMVM' and not st: mesg = ''.join(se) if mesg.find('Error in dyn.load') >= 0: st = 1 if st: print(' %-20s : FAILURE' % prog) print(ind + indn.join(se)) fcount += 1 else: print(' %-20s : success' % prog) # no OpenMP problem if prog == '3dAllineate': self.ok_openmp = 1 print('') pfailure = fcount == len(proglist) if fcount > 0: self.afni_fails = fcount self.comments.append('AFNI programs show FAILURE') # if complete failure, retry from exec dir ascdir = UTIL.executable_dir() if pfailure and self.afni_dir != ascdir: fcount = 0 print('none working, testing programs under implied %s...' % ascdir) for prog in proglist: st, so, se = BASE.shell_exec2('%s/%s -help'%(ascdir,prog),capture=1) if st: print(' %-20s : FAILURE' % prog) print(ind + indn.join(se)) fcount += 1 else: print(' %-20s : success' % prog) print('') if fcount < len(proglist): self.comments.append('consider adding %s to your PATH' % ascdir) # if afni_dir is not set, use ascdir if self.afni_dir == '': self.afni_dir = ascdir print('checking for R packages...') cmd = 'rPkgsInstall -pkgs ALL -check' st, so, se = BASE.shell_exec2(cmd, capture=1) if st or len(se) < 2: okay = 0 else: if se[1].startswith('++ Note:'): se = se[2:] okay = 1 # do not require "verified", but fail on "not installed" # (to avoid failing on 'unknown timezone' warnings) for estr in se: if estr != '' and estr.find('not installed') >= 0: okay = 0 # any failure is terminal break if okay: print(' %-20s : success' % cmd) else: print(' %-20s : FAILURE' % cmd) print(ind + indn.join(se)) self.comments.append('missing R packages (see rPkgsInstall)') print('') status, cout = UTIL.exec_tcsh_command("R RHOME") print('R RHOME : %s' % cout.strip()) print('') print('checking for $HOME files...') flist = ['.afnirc', '.sumarc', '.afni/help/all_progs.COMP'] for ff in flist: if os.path.isfile('%s/%s'%(self.home_dir, ff)): fstr = 'found' else: fstr = 'missing' print(' %-25s : %s' % (ff, fstr)) # add to comments if self.afni_dir: ccc = 'run: cp %s/AFNI.afnirc ~/.afnirc' % self.afni_dir else: ccc = 'copy AFNI.afnirc to ~/.afnirc' self.add_file_comment(None, '.afnirc', 'please %s' % ccc) self.add_file_comment(None, '.sumarc', 'please run: "suma -update_env" for .sumarc') self.add_file_comment(None, '.afni/help/all_progs.COMP', 'please run: apsearch -update_all_afni_help') print('')