ATLAS Offline Software
Loading...
Searching...
No Matches
Tools/PyUtils/python/Helpers.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 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
18
19def ROOTSetup(batch=True):
20 """
21 Do basic ROOT setup. This should be called before any other import of ROOT.
22 """
23 from AthenaCommon.Logging import log
24 log.debug('Setting ROOT batch mode to %s', batch)
25
26 if batch is True:
27 os.environ['ROOT_BATCH'] = '1'
28 else:
29 os.environ.pop('ROOT_BATCH', None)
30
31
32class ShutUp(object):
33 """
34 A little helper class to keep ROOT silent...
35 """
36 DefaultFilter = [
37 re.compile("Warning in <TClass::TClass>: no dictionary for class."),
38 re.compile("Warning in <TEnvRec::ChangeValue>: duplicate entry."),
39 re.compile("Error in <TStreamerInfo::BuildOld>:."),
40 ]
41 def __init__(self, filters = DefaultFilter):
42 self._dummy = False # if dummy, we don't really shut-up ROOT...
43 if os.environ.get('PYUTILS_SHUTUP_DEBUG', '0') == '1':
44 self._dummy = True
45
46 self.save_err = open( '/dev/null', 'w' )
47 self.save_out = open( '/dev/null', 'w' )
48 try:
49 self.quiet_err = NamedTemporaryFile( suffix = ".msg.log" )
50 self.quiet_out = NamedTemporaryFile( suffix = ".msg.log" )
51 except OSError:
52 # load problem ?
53 # retry a bit later... (in 2 seconds)
54 import time
55 time.sleep(2) #
56 try:
57 self.quiet_err = NamedTemporaryFile( suffix = ".msg.log" )
58 self.quiet_out = NamedTemporaryFile( suffix = ".msg.log" )
59 except OSError:
60 # then (implicitly) fallback on sys.stderr
61 self._dummy = True
62
63 self.filters = filters
64
65 if not self._dummy:
66 os.dup2( sys.stderr.fileno(), self.save_err.fileno() )
67 os.dup2( sys.stdout.fileno(), self.save_out.fileno() )
68 return
69
70 def __del__ (self):
71 self.save_err.close()
72 self.save_out.close()
73 self.quiet_err.close()
74 self.quiet_out.close()
75 return
76
77 def mute(self):
78 if not self._dummy:
79 os.dup2( self.quiet_err.fileno(), sys.stderr.fileno() )
80 os.dup2( self.quiet_out.fileno(), sys.stdout.fileno() )
81 return
82
83 def unMute(self):
84 if not self._dummy:
85 os.dup2( self.save_err.fileno(), sys.stderr.fileno() )
86 os.dup2( self.save_out.fileno(), sys.stdout.fileno() )
88 self.quiet_err.seek(0)
90 self.quiet_out.seek(0)
91 return
92
93 def __filterRootMessages(self, fd):
94 fd.seek(0)
95 for l in fd.readlines():
96 l = l.decode()
97 printOut = True
98 for filter in self.filters:
99 if re.match(filter, l):
100 printOut = False
101 if printOut:
102 print ("PyRoot:",l.replace("\n",""))
103 pass
104 return
105
106 # context-manager protocol
107 def __enter__(self):
108 return self.mute()
109 def __exit__(self,exc_type, exc_val, exc_tb):
110 return self.unMute()
111
112
113@cache
115 """Returns information about the current release based on ReleaseData"""
116
117 import configparser
118 d = {
119 'project name': '?',
120 'release': '?',
121 'base release': '?',
122 'nightly release': '?',
123 'nightly name': '?',
124 'date': '?',
125 'platform': '?',
126 }
127
128 for cmake_path in os.environ['CMAKE_PREFIX_PATH'].split(os.pathsep):
129 release_data = os.path.join(cmake_path, 'ReleaseData')
130 if os.path.exists(release_data):
131 d1=d
132 cfg = configparser.ConfigParser()
133 try:
134 cfg.read( release_data )
135 if cfg.has_section( 'release_metadata' ):
136 d1.update( dict( cfg.items( 'release_metadata' ) ) )
137 d1['platform'] = os.getenv( '%s_PLATFORM' % d1['project name'],
138 '?' )
139 release = d1['release'].split('.')
140 base_release = d1['base release'].split('.')
141 if len(release)>=3 or len(base_release)>=3:
142 return d1
143 except Exception:
144 pass
145 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:179