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