ATLAS Offline Software
Loading...
Searching...
No Matches
Tools/PyUtils/python/Helpers.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3# @author: Sebastien Binet <binet@cern.ch>
4# @date: March 2007
5#
6#
7
8import re
9import os
10import sys
11from functools import cache
12from tempfile import NamedTemporaryFile
13# !!!
14# Do not add any Athena dependencies at the module-level as some of the code here
15# is used during the build (see athena!62739).
16# !!!
17
18def ROOTSetup(batch=False):
19 """
20 At this point this function just makes sure the ROOT batch mode is set
21 correctly when someone imports ROOT
22 """
23 from AthenaCommon.Logging import log
24 import builtins as builtin_mod
25 oldimporthook = builtin_mod.__import__
26 batch_mode = bool(batch)
27
28 def root6_importhook(name, globals={}, locals={}, fromlist=[], level=0):
29 nonlocal batch_mode
30 isroot = False
31 bm = batch_mode
32 if name=='ROOT' or (name[0:4]=='ROOT' and name!='ROOT.pythonization'):
33 isroot = True
34 batch_mode = None # only set it on first ROOT import
35
36 m = oldimporthook(name, globals, locals, fromlist, level)
37
38 if m and isroot:
39 log.debug('Python import module=%s, fromlist=%s', name, fromlist)
40 if bm is not None:
41 log.debug('Setting ROOT batch mode to %s', bm)
42 m.gROOT.SetBatch(bm)
43
44 return m
45
46 builtin_mod.__import__ = root6_importhook
47
48
50 """
51 A little helper class to keep ROOT silent...
52 """
53 DefaultFilter = [
54 re.compile("Warning in <TClass::TClass>: no dictionary for class."),
55 re.compile("Warning in <TEnvRec::ChangeValue>: duplicate entry."),
56 re.compile("Error in <TStreamerInfo::BuildOld>:."),
57 ]
58 def __init__(self, filters = DefaultFilter):
59 self._dummy = False # if dummy, we don't really shut-up ROOT...
60 if os.environ.get('PYUTILS_SHUTUP_DEBUG', '0') == '1':
61 self._dummy = True
62
63 self.save_err = open( '/dev/null', 'w' )
64 self.save_out = open( '/dev/null', 'w' )
65 try:
66 self.quiet_err = NamedTemporaryFile( suffix = ".msg.log" )
67 self.quiet_out = NamedTemporaryFile( suffix = ".msg.log" )
68 except OSError:
69 # load problem ?
70 # retry a bit later... (in 2 seconds)
71 import time
72 time.sleep(2) #
73 try:
74 self.quiet_err = NamedTemporaryFile( suffix = ".msg.log" )
75 self.quiet_out = NamedTemporaryFile( suffix = ".msg.log" )
76 except OSError:
77 # then (implicitly) fallback on sys.stderr
78 self._dummy = True
79
80 self.filters = filters
81
82 if not self._dummy:
83 os.dup2( sys.stderr.fileno(), self.save_err.fileno() )
84 os.dup2( sys.stdout.fileno(), self.save_out.fileno() )
85 return
86
87 def __del__ (self):
88 self.save_err.close()
89 self.save_out.close()
90 return
91
92 def mute(self):
93 if not self._dummy:
94 os.dup2( self.quiet_err.fileno(), sys.stderr.fileno() )
95 os.dup2( self.quiet_out.fileno(), sys.stdout.fileno() )
96 return
97
98 def unMute(self):
99 if not self._dummy:
100 os.dup2( self.save_err.fileno(), sys.stderr.fileno() )
101 os.dup2( self.save_out.fileno(), sys.stdout.fileno() )
103 self.quiet_err.seek(0)
105 self.quiet_out.seek(0)
106 return
107
108 def __filterRootMessages(self, fd):
109 fd.seek(0)
110 for l in fd.readlines():
111 l = l.decode()
112 printOut = True
113 for filter in self.filters:
114 if re.match(filter, l):
115 printOut = False
116 if printOut:
117 print ("PyRoot:",l.replace("\n",""))
118 pass
119 return
120
121 # context-manager protocol
122 def __enter__(self):
123 return self.mute()
124 def __exit__(self,exc_type, exc_val, exc_tb):
125 return self.unMute()
126
127
128@cache
130 """Returns information about the current release based on ReleaseData"""
131
132 import configparser
133 d = {
134 'project name': '?',
135 'release': '?',
136 'base release': '?',
137 'nightly release': '?',
138 'nightly name': '?',
139 'date': '?',
140 'platform': '?',
141 }
142
143 for cmake_path in os.environ['CMAKE_PREFIX_PATH'].split(os.pathsep):
144 release_data = os.path.join(cmake_path, 'ReleaseData')
145 if os.path.exists(release_data):
146 d1=d
147 cfg = configparser.ConfigParser()
148 try:
149 cfg.read( release_data )
150 if cfg.has_section( 'release_metadata' ):
151 d1.update( dict( cfg.items( 'release_metadata' ) ) )
152 d1['platform'] = os.getenv( '%s_PLATFORM' % d1['project name'],
153 '?' )
154 release = d1['release'].split('.')
155 base_release = d1['base release'].split('.')
156 if len(release)>=3 or len(base_release)>=3:
157 return d1
158 except Exception:
159 pass
160 return d
__init__(self, filters=DefaultFilter)
__exit__(self, exc_type, exc_val, exc_tb)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177