summaryrefslogtreecommitdiffstats
path: root/python/knot_resolver_manager/utils/which.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/knot_resolver_manager/utils/which.py')
-rw-r--r--python/knot_resolver_manager/utils/which.py22
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")