1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16  """Methods and classes dealing with file access.""" 
 17   
 18  import logging 
 19  import os 
 20  import shutil 
 21   
 22   
 23  logger = logging.getLogger('madgraph.files') 
 24   
 25   
 26   
 27   
 29      """Open a file, apply the function myfunct (with sock as an arg)  
 30      on its content and return the result. Deals properly with errors and 
 31      returns None if something goes wrong.  
 32      """ 
 33   
 34      try: 
 35          sock = open(filename, 'r') 
 36          try: 
 37              ret_value = myfunct(sock, *args) 
 38          finally: 
 39              sock.close() 
 40      except IOError, (errno, strerror): 
 41          if opt.has_key('print_error'): 
 42              if not opt['print_error']: 
 43                  return None 
 44          logger.error("I/O error on file %s (%s): %s" % (filename,errno, strerror)) 
 45          return None 
 46   
 47      return ret_value 
  48   
 49   
 50   
 51   
 53      """Open a file for writing, apply the function myfunct (with sock as an arg)  
 54      on its content and return the result. Deals properly with errors and 
 55      returns None if something goes wrong.  
 56      """ 
 57   
 58      try: 
 59          sock = open(filename, 'w') 
 60          try: 
 61              ret_value = myfunct(sock, *args) 
 62          finally: 
 63              sock.close() 
 64      except IOError, (errno, strerror): 
 65          logger.error("I/O error (%s): %s" % (errno, strerror)) 
 66          return None 
 67   
 68      return ret_value 
  69   
 70   
 71   
 72   
 74      """Open a file for appending, apply the function myfunct (with 
 75      sock as an arg) on its content and return the result. Deals 
 76      properly with errors and returns None if something goes wrong. 
 77      """ 
 78   
 79      try: 
 80          sock = open(filename, 'a') 
 81          try: 
 82              ret_value = myfunct(sock, *args) 
 83          finally: 
 84              sock.close() 
 85      except IOError, (errno, strerror): 
 86          logger.error("I/O error (%s): %s" % (errno, strerror)) 
 87          return None 
 88   
 89      return ret_value 
  90   
 91   
 92   
 93   
 94 -def is_uptodate(picklefile, path_list=None, min_time=1300120445): 
  95      """Check if the pickle files is uptodate compare to a list of files.  
 96      If no files are given, the pickle files is checked against it\' current  
 97      directory""" 
 98       
 99      if not os.path.exists(picklefile): 
100          return False 
101       
102      if not path_list: 
103          dirpath = os.path.dirname(picklefile) 
104          path_list = [ os.path.join(dirpath, file) for file in \ 
105                                                              os.listdir(dirpath)] 
106       
107      assert type(path_list) == list, 'is_update expect a list of files' 
108       
109      pickle_date = os.path.getctime(picklefile) 
110      if pickle_date < min_time: 
111          return False 
112       
113      for path in path_list: 
114          try: 
115              if os.path.getmtime(path) > pickle_date: 
116                  return False 
117          except Exception: 
118              continue 
119       
120      return True 
 121   
122   
123   
124   
125   
132       
133 -def cp(path1, path2, log=True): 
 134      """ simple cp taking linux or mix entry""" 
135      path1 = format_path(path1) 
136      path2 = format_path(path2) 
137      try: 
138          shutil.copy(path1, path2) 
139      except IOError, why: 
140          if log: 
141              logger.warning(why) 
 142           
143       
144 -def mv(path1, path2): 
 145      """simple mv taking linux or mix format entry""" 
146      path1 = format_path(path1) 
147      path2 = format_path(path2) 
148      try: 
149          shutil.move(path1, path2) 
150      except: 
151           
152          if os.path.isfile(path2): 
153              os.remove(path2) 
154              shutil.move(path1, path2) 
155              return 
156          elif os.path.isdir(path2) and os.path.exists( 
157                                     os.path.join(path2, os.path.basename(path1))):       
158              path2 = os.path.join(path2, os.path.basename(path1)) 
159              os.remove(path2) 
160              shutil.move(path1, path2) 
161          else: 
162              raise 
 163           
164 -def ln(file_pos, starting_dir='.', name='', log=True): 
 165      """a simple way to have a symbolic link whithout to have to change directory 
166      starting_point is the directory where to write the link 
167      file_pos is the file to link 
168      WARNING: not the linux convention 
169      """ 
170      file_pos = format_path(file_pos) 
171      starting_dir = format_path(starting_dir) 
172      if not name: 
173          name = os.path.split(file_pos)[1]     
174   
175       
176      if os.path.islink(os.path.join(starting_dir, name)): 
177          os.remove(os.path.join(starting_dir, name)) 
178   
179      try: 
180          os.symlink(os.path.relpath(file_pos, starting_dir), \ 
181                          os.path.join(starting_dir, name)) 
182      except: 
183          if log: 
184              logger.warning('Could not link %s at position: %s' % (file_pos, \ 
185                                                  os.path.realpath(starting_dir))) 
 186