4 from PyJobTransformsCore
import fileutil
6 __doc__ =
"""Environment variables utilities"""
9 LD_LIBRARY_PATH =
'LD_LIBRARY_PATH'
12 filenameWildCards =
r'\?|\*|\[.*\]'
13 filenameWildCardsCompiled = re.compile(filenameWildCards)
16 defaultPathSeps = os.pathsep +
'|,'
19 _libraryNameRE = re.compile(
r'\.so(\.[0-9]+)*$')
23 """Return boolean indicating if the filename contains any unix shell filename wildcards"""
24 if filenameWildCardsCompiled.search(filename):
31 dirlist = [ os.getcwd() ],
34 """Search for file <filename> with access rights <access> (see os.access()) in directory list <dirlist>.
35 Search into directory tree of each directory in <dirlist> up to depth <depth>. The default directory
36 list is a list containing only the current working directory.
37 No wildcards are allowed in <filename>.
38 <depth> = 0 : only search in directories given in list.
39 <depth> > 0 : descend deeper into the directory tree up to max <depth> levels.
40 <depth> < 0 : ascend upwards into the directory tree up to max -<depth> levels.
41 It returns 2-tuple (dir,file) where:
42 file=<filename> if no wildcards, or the actual (local) match to <filename> if wildcarded.
43 dir=the directory where <file> was found (from <dirlist>, or from a subdir if depth > 0)
44 If no file is found, it returns None."""
45 if not dirlist:
return None
47 dir = os.path.abspath( os.path.expandvars( os.path.expanduser(dir) ) )
48 if not os.path.isdir(dir):
continue
49 fullfile = os.path.join( dir, filename )
51 if fileutil.access( fullfile, access ):
60 dir = os.path.abspath( os.path.expandvars( os.path.expanduser(dir) ) )
61 if not os.path.isdir(dir):
continue
63 for d
in fileutil.listdir(dir):
64 fulldir = os.path.join(dir,d)
65 if os.path.isdir(fulldir):
66 subdirlist.append( fulldir )
69 if found:
return found
73 dir = os.path.abspath( os.path.expandvars( os.path.expanduser(dir) ) )
74 if not os.path.isdir(dir):
continue
75 updir = os.path.dirname(dir)
78 if found:
return found
86 dirlist = [ os.getcwd() ],
89 """Search for file <filename> with access rights <access> (see os.access()) in directory list <dirlist>,
90 Search into directory tree of each directory up to depth <depth>. The default directory list is
91 a list containing only the current working directory.
92 <depth> = 0 : only search in directories given in list.
93 <depth> > 0 : descend deeper into the directory tree up to max <depth> levels.
94 <depth> < 0 : ascend upwards into the directory tree up to max -<depth> levels."""
96 return found
and os.path.join( found[0], found[1] )
100 """Search for all (regular) files that match <filename> with access rights <access> (see os.access())
101 in directory list <dirlist>.
102 Search is done into subdirectories each directory up to depth <depth>.
103 The default value for <dirlist> is the current working directory.
104 If the same file (without the directory name) is found in more than one places, only the first match is kept.
105 <filename> : can contain wildcards as used on the unix command line.
106 <depth> = 0 : only search in directories given in list.
107 <depth> < 0 : treated as = 0
108 <depth> > 0 : descend deeper into the directory tree up to max <depth> levels.
109 It returns a list of 2-tuples (dir,file) where
110 file=<filename> if no wildcards, or the actual (local) match to <filename> if wildcarded.
111 dir=the directory where <file> was found (from <dirlist>, or from a subdir if depth > 0)
112 If none is found, an empty list is returned."""
115 if depth < 0: depth = 0
120 return [ singleFile ]
127 dir = os.path.abspath( os.path.expandvars( os.path.expanduser(dir) ) )
129 if not os.path.isdir(dir):
continue
133 filelist = glob.glob(filename)
136 if not os.path.isfile(f)
or not fileutil.access(f, access):
continue
137 if f
not in filenameList:
139 dirnameList.append(dir)
140 filenameList.append(f)
148 dir = os.path.abspath( os.path.expandvars( os.path.expanduser(dir) ) )
150 if not os.path.isdir(dir):
continue
152 for d
in fileutil.listdir(dir):
153 fulldir = os.path.join(dir,d)
154 if os.path.isdir(fulldir):
155 subdirlist.append( fulldir )
159 if not f[1]
in filenameList:
160 dirnameList.append(f[0])
161 filenameList.append(f[1])
162 return map(
lambda arg1,arg2 : (arg1,arg2) , dirnameList, filenameList )
166 """Search for all (regular) files that match <filename> with access rights <access> (see os.access()) in directory list <dirlist>.
167 Search is done into subdirectories each directory up to depth <depth>.
168 The default value for <dirlist> is the current working directory.
169 If the same file (without the directory name) is found in more than one places, only the first match is kept.
170 <filename> : can contain wildcards as used on the unix command line.
171 <depth> = 0 : only search in directories given in list.
172 <depth> < 0 : treated as = 0
173 <depth> > 0 : descend deeper into the directory tree up to max <depth> levels.
174 It returns a list of filenames with full pathnames. If none is found, an empty list is returned."""
175 return list (map(
lambda arg : os.path.join( arg[0], arg[1] ),
find_files_split( filename, dirlist, access, depth ) ))
178 def find_file_env( filename, env_var_name, access = os.R_OK, sep = defaultPathSeps, depth = 0 ):
179 """Search for file <filename> with access rights <access> (see os.access()) in directory list
180 given as a <sep> separated list of paths in environment variable <env_var_name>.
181 Search into directory tree of each directory up to depth <depth> (0=don't descend at all)."""
182 env = os.environ.get( env_var_name )
183 envList = [ os.getcwd() ]
186 envList.extend( re.split( sep, env ) )
187 return find_file( filename, envList, access, depth )
190 def find_files_env( filename, env_var_name, access = os.R_OK, sep = defaultPathSeps, depth = 0 ):
191 """Search for all files that match <filename> with access rights <access> (see os.access()) in directory list
192 given as a <sep> (a regular expression) separated list of paths in environment variable <env_var_name>.
193 <filename> can contain wildcards as used on the unix command line.
194 Search into directory tree of each directory up to depth <depth> (0=don't descend at all)."""
195 env = os.environ.get( env_var_name )
196 envList = [ os.getcwd() ]
199 envList.extend( re.split( sep, env ) )
200 return find_files( filename, envList, access, depth )
204 """Search for libraries in LD_LIBRARY_PATH. Return list of full paths of libraries if found.
205 <lib> can contain wildcards, in which case all files matching the wildcard will be returned.
206 If the same file appears in several paths, the first one found will be taken."""
208 global _libraryNameRE
211 if _libraryNameRE.search(lib):
216 libsfull = [ l
for l
in libsfull
if _libraryNameRE.search(l) ]
219 libname = lib +
'.so*'
222 libsfull = [ l
for l
in libsfull
if _libraryNameRE.search(l) ]
225 if not libsfull
and not lib.startswith(
'lib'):