From 349d1a26927fcc3b58b587b15cf692ed8661c502 Mon Sep 17 00:00:00 2001 From: erikhuck Date: Wed, 11 Nov 2026 18:42:10 -0500 Subject: [PATCH] Handles PermissionError --- src/gpu_tracker/_helper_classes.py | 7 +++++++ tests/test_tracker.py | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/gpu_tracker/_helper_classes.py b/src/gpu_tracker/_helper_classes.py index 5d91276..ed6409f 100644 --- a/src/gpu_tracker/_helper_classes.py +++ b/src/gpu_tracker/_helper_classes.py @@ -10,6 +10,7 @@ import sqlalchemy.orm as sqlorm import enum import tqdm +import logging as log _SUMMARY_STATS = ['min', 'max', 'mean', 'std'] @@ -36,6 +37,12 @@ def is_available(cls) -> bool | None: return False except FileNotFoundError: return None + except PermissionError: + log.warning( + f'gpu-tracker encountered a PermissionError when checking if "{cls.command}" is installed. ' + 'You might have a directory in your PATH environment variable that lacks execute permissions.' + ) + return None @classmethod @abc.abstractmethod diff --git a/tests/test_tracker.py b/tests/test_tracker.py index 20908ce..36ba94e 100644 --- a/tests/test_tracker.py +++ b/tests/test_tracker.py @@ -402,3 +402,13 @@ def test_formatting_before_tracking_stops(): 'Cannot display the tracker in string or JSON format before tracking completes. Exit the content manager or call the stop() ' 'method before calling to_json() or str()' ) + + +def test_is_available_permission_error(mocker, caplog): + mocker.patch('gpu_tracker._helper_classes.subp.check_output', side_effect=PermissionError) + # noinspection PyProtectedMember + from gpu_tracker._helper_classes import _NvidiaQuerier + result = _NvidiaQuerier.is_available() + assert result is None + assert 'PermissionError' in caplog.text + assert 'nvidia-smi' in caplog.text