Tools¶
Myokit contains a module myokit.tools
with functions and classes that are
used throughout Myokit, but are not particularly Myokit-specific.
This module is imported automatically when import myokit
is run.
Benchmarking¶
- class myokit.tools.Benchmarker¶
Provides reasonably precise benchmarking (with times obtained from
timeit.default_timer()
) and formats times.Example:
m,p,x = myokit.load('example') s = myokit.Simulation(m, p) b = myokit.tools.Benchmarker() s.run() print(b.time()) b.reset() s.run() print(b.format())
- format(time=None)¶
Formats a (non-integer) number of seconds, returns a string like “5 weeks, 3 days, 1 hour, 4 minutes, 9 seconds”, or “0.0019 seconds”.
If no
time
is passed in, the value fromtime()
is used.
- print(message)¶
Prints a message to stdout, preceded by the benchmarker time in us.
- reset()¶
Resets this timer’s start time.
- time()¶
Returns the time since benchmarking started (as a float, in seconds).
Capturing printed output¶
- class myokit.tools.capture(fd=False, enabled=True)¶
Context manager that temporarily redirects the current standard output and error streams, and captures anything that’s written to them.
Example:
with myokit.tools.capture() as a: print('This will be captured')
Within a single thread, captures can be nested, for example:
with myokit.tools.capture() as a: print('This will be captured by a') with myokit.tools.capture() as b: print('This will be captured by b, not a') print('This will be captured by a again')
Capturing is thread-safe: a lock is used to ensure only a single thread is capturing at any time. For example, if we have a function:
def f(i): with myokit.tools.capture() as a: print(i) ... return a.text()
and this is called from several threads, the
capture
acts as a lock (athreading.RLock
) so that one thread will need to finish executing the code within thewith
statement before a second thread can start capturing.In multiprocessing, no locks are used, and no memory or streams are shared so that this should also be safe.
By default, this method works by simply redirecting
sys.stdout
andsys.stderr
. This captures any output written by the Python interpreter, but does not catch output from C/C++ extensions or subrocesses. To also catch that output start the capture with the optional argumentfd=True
, which enables a file descriptor duplication method of redirection.To easily switch capturing on/off, a switch
enabled=False
can be passed in to create a context manager that doesn’t do anything.- err()¶
Returns the text captured from stderr, or an empty string if nothing was captured or capturing is still active.
- out()¶
Returns the text captured from stdout, or an empty string if nothing was captured or capturing is still active.
- text()¶
Returns the combined text captured from output and error text, if any (output first, then error text).
File system¶
- myokit.tools.format_path(path, root='.')¶
Formats a path for use in user messages. If the given path is a subdirectory of the current directory this part is chopped off.
Alternatively, a
root
directory may be given explicitly: any subdirectory of this path will be formatted relative toroot
.This function differs from os.path.relpath() in the way it handles paths outside the root: In these cases relpath returns a relative path such as ‘../../’ while this function returns an absolute path.
- myokit.tools.rmtree(path, silent=False)¶
Version of
shutil.rmtree
that handles Windows “access denied” errors (when the user is lacking write permissions, but is allowed to set them).If
silent=True
any other exceptions will be caught and ignored.
String comparison¶
- myokit.tools.lvsd(s, t)¶
Returns the Levenshtein distance between two strings
s
andt
.
- myokit.tools.natural_sort_key(s)¶
Function to use as
key
in a sort, to get natural sorting of strings (e.g. “2” before “10”).Usage examples:
names.sort(key=myokit.tools.natural_sort_key) variables.sort(key=lambda v: myokit.tools.natural_sort_key(v.qname()))
Deprecated functions¶
Some of the functions in tools
have deprecated aliases, that will be
removed in future Myokit releases.
- class myokit.Benchmarker¶
Deprecated alias of
myokit.tools.Benchmarker
.
- myokit.format_float_dict(d)¶
Takes a dictionary of
string : float
mappings and returns a single multi-line string, where each line is of the formkey = value
, where key is padded with spaces to make the equals signs align.This method is deprecated and will be removed in future versions of Myokit.
- myokit.format_path(path, root='.')¶
Deprecated alias of
myokit.tools.format_path
.
- myokit.strfloat(number, full=False, precision=64)¶
Deprecated alias of
myokit.float.str
.