ATLAS Offline Software
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 
8 import re
9 import os
10 import sys
11 from functools import cache
12 from 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 def 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 
49 class ShutUp(object):
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
python.Helpers.release_metadata
def release_metadata()
Definition: Tools/PyUtils/python/Helpers.py:129
python.Helpers.ROOTSetup
def ROOTSetup(batch=False)
Definition: Tools/PyUtils/python/Helpers.py:18
python.Helpers.ShutUp.save_err
save_err
Definition: Tools/PyUtils/python/Helpers.py:63
python.Helpers.ShutUp
Definition: Tools/PyUtils/python/Helpers.py:49
python.Helpers.ShutUp.quiet_err
quiet_err
Definition: Tools/PyUtils/python/Helpers.py:66
python.Helpers.ShutUp.filters
filters
Definition: Tools/PyUtils/python/Helpers.py:80
python.Helpers.ShutUp.__filterRootMessages
def __filterRootMessages(self, fd)
Definition: Tools/PyUtils/python/Helpers.py:108
python.Helpers.ShutUp.quiet_out
quiet_out
Definition: Tools/PyUtils/python/Helpers.py:67
python.Helpers.ShutUp.mute
def mute(self)
Definition: Tools/PyUtils/python/Helpers.py:92
python.Helpers.ShutUp.save_out
save_out
Definition: Tools/PyUtils/python/Helpers.py:64
python.Helpers.ShutUp._dummy
_dummy
Definition: Tools/PyUtils/python/Helpers.py:59
Trk::open
@ open
Definition: BinningType.h:40
python.Helpers.ShutUp.__init__
def __init__(self, filters=DefaultFilter)
Definition: Tools/PyUtils/python/Helpers.py:58
python.Helpers.ShutUp.__del__
def __del__(self)
Definition: Tools/PyUtils/python/Helpers.py:87
pickleTool.object
object
Definition: pickleTool.py:29
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.Helpers.ShutUp.unMute
def unMute(self)
Definition: Tools/PyUtils/python/Helpers.py:98
python.Helpers.ShutUp.__enter__
def __enter__(self)
Definition: Tools/PyUtils/python/Helpers.py:122
python.Helpers.ShutUp.__exit__
def __exit__(self, exc_type, exc_val, exc_tb)
Definition: Tools/PyUtils/python/Helpers.py:124