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 return
74
75 def mute(self):
76 if not self._dummy:
77 os.dup2( self.quiet_err.fileno(), sys.stderr.fileno() )
78 os.dup2( self.quiet_out.fileno(), sys.stdout.fileno() )
79 return
80
81 def unMute(self):
82 if not self._dummy:
83 os.dup2( self.save_err.fileno(), sys.stderr.fileno() )
84 os.dup2( self.save_out.fileno(), sys.stdout.fileno() )
86 self.quiet_err.seek(0)
88 self.quiet_out.seek(0)
89 return
90
91 def __filterRootMessages(self, fd):
92 fd.seek(0)
93 for l in fd.readlines():
94 l = l.decode()
95 printOut = True
96 for filter in self.filters:
97 if re.match(filter, l):
98 printOut = False
99 if printOut:
100 print ("PyRoot:",l.replace("\n",""))
101 pass
102 return
103
104 # context-manager protocol
105 def __enter__(self):
106 return self.mute()
107 def __exit__(self,exc_type, exc_val, exc_tb):
108 return self.unMute()
109
110
111@cache
113 """Returns information about the current release based on ReleaseData"""
114
115 import configparser
116 d = {
117 'project name': '?',
118 'release': '?',
119 'base release': '?',
120 'nightly release': '?',
121 'nightly name': '?',
122 'date': '?',
123 'platform': '?',
124 }
125
126 for cmake_path in os.environ['CMAKE_PREFIX_PATH'].split(os.pathsep):
127 release_data = os.path.join(cmake_path, 'ReleaseData')
128 if os.path.exists(release_data):
129 d1=d
130 cfg = configparser.ConfigParser()
131 try:
132 cfg.read( release_data )
133 if cfg.has_section( 'release_metadata' ):
134 d1.update( dict( cfg.items( 'release_metadata' ) ) )
135 d1['platform'] = os.getenv( '%s_PLATFORM' % d1['project name'],
136 '?' )
137 release = d1['release'].split('.')
138 base_release = d1['base release'].split('.')
139 if len(release)>=3 or len(base_release)>=3:
140 return d1
141 except Exception:
142 pass
143 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