4 Utility module for things not specific to DQ
8 from contextlib
import contextmanager
9 from logging
import getLogger; log =
getLogger(
"DQUtils.general")
11 from time
import time, mktime, strptime, strftime, gmtime
12 from subprocess
import getoutput
16 Returns package version as determined from "cmt show versions"
18 if "/" not in package_name
and default_prefix:
19 package_name =
"/".
join([default_prefix, package_name])
20 output =
getoutput(
"cmt show versions %s" % package_name).
split(
"\n")
21 output =
list(map(str.strip, output))
27 Generate kcachegrind profile information for a call.
31 with kgrind_profile() as p:
34 from cProfile
import Profile
39 from .ext.lsprofcalltree
import KCacheGrind
40 with open(filename,
"w")
as fd:
41 KCacheGrind(p).output(fd)
43 def daemonize(function, delay, error_args=None, **kwargs):
45 Run a daemon which executes `function` every `delay` seconds.
47 from time
import sleep
50 log.info(
"Sleeping for %i seconds..", delay)
53 log.info(
"Current time: %s", strftime(
"%d/%m/%Y %H:%M:%S"))
57 if error_args
is not None:
64 Send an error email containing `exception_info`
65 TODO: Doesn't contain complete information
70 from email.mime.text
import MIMEText
71 from getpass
import getuser
72 from socket
import gethostname
74 exceptionType, exceptionValue, exceptionTraceback = exception_info
76 user, host = getuser(), gethostname()
78 extra_info = [
"Was running as user '%s' on machine '%s'" % (user, host),
82 msg = MIMEText(
"\n\n".
join(body + extra_info +
83 traceback.format_tb(exceptionTraceback)))
85 msg[
'Subject'] = subject
90 "Peter Onyisi <peter.onyisi@cern.ch>"
96 msg[
'To'] =
", ".
join(to)
101 s.sendmail(from_, to, msg.as_string())
104 log.error(
"Error email sent.")
108 Returns true if all input arguments are equal (must be hashable)
110 return len(
set(inputs)) == 1
114 Generate all permutations of `input_list`
116 if len(input_list) <= 1:
120 for i
in range(len(perm)+1):
121 yield perm[:i] + input_list[0:1] + perm[i:]
127 while type(result)
is list
and len(result)
and callable(result[0]):
130 result = result[0]([])
134 if type(l)
is not list:
143 Turn down the logging verbosity temporarily
145 if log_level
is None:
146 log_level = log.WARNING
149 logger = log.getLogger()
151 orig_level = logger.level
152 logger.setLevel(log_level)
157 logger.setLevel(orig_level)
161 "A context manager which spits out how long the block took to execute"
167 log.debug(
"Took %.2f to %s", end - start, name)
170 return [item
for items
in zip(*args)
for item
in items]
174 Returns number of nanoseconds between unix epoch and date in the form
177 return int(mktime(strptime(date_string,
"%d/%m/%Y")) * 1e9)
181 Returns a string representation of `nanounix` nanoseconds
184 sub_second =
"%03i" % ((nanounix %
int(1e9)) / 1e6)
186 return strftime(
"%Y%m%d:%H%M%S.", gmtime(nanounix / 1e9)) + sub_second
188 return "[BadTime: %s]" %
int(nanounix)