diff options
Diffstat (limited to 'python/knot_resolver_manager/utils/which.py')
-rw-r--r-- | python/knot_resolver_manager/utils/which.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/python/knot_resolver_manager/utils/which.py b/python/knot_resolver_manager/utils/which.py new file mode 100644 index 00000000..450102f3 --- /dev/null +++ b/python/knot_resolver_manager/utils/which.py @@ -0,0 +1,22 @@ +import functools +import os +from pathlib import Path + + +@functools.lru_cache(maxsize=16) +def which(binary_name: str) -> Path: + """ + Given a name of an executable, search $PATH and return + the absolute path of that executable. The results of this function + are LRU cached. + + If not found, throws an RuntimeError. + """ + + possible_directories = os.get_exec_path() + for dr in possible_directories: + p = Path(dr, binary_name) + if p.exists(): + return p.absolute() + + raise RuntimeError(f"Executable {binary_name} was not found in $PATH") |