예제 #1
0
   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('')
예제 #2
0
   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('')
예제 #3
0
   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('')
예제 #4
0
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)
예제 #5
0
   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('')
예제 #6
0
   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('')
예제 #7
0
 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('')
예제 #8
0
    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
예제 #9
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()
예제 #10
0
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
예제 #11
0
   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('')