From 3e3a18a0572727da8ed9b9c7ae6de7cea80aab0e Mon Sep 17 00:00:00 2001 From: Glenn Jocher Date: Wed, 24 Mar 2021 01:05:59 +0100 Subject: [PATCH] Enhanced check_requirements() with auto-install (#2575) * Update check_requirements() with auto-install This PR builds on an idea I had to automatically install missing dependencies rather than simply report an error message. YOLOv5 should now 1) display all dependency issues and not simply display the first missing dependency, and 2) attempt to install/update each missing/VersionConflict package. * cleanup * cleanup 2 * Check requirements.txt file exists * cleanup 3 --- utils/general.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/utils/general.py b/utils/general.py index 621df64c6cf1..ef89ea3a0f03 100755 --- a/utils/general.py +++ b/utils/general.py @@ -1,4 +1,4 @@ -# General utils +# YOLOv5 general utils import glob import logging @@ -86,10 +86,20 @@ def check_git_status(): def check_requirements(file='requirements.txt', exclude=()): # Check installed dependencies meet requirements - import pkg_resources - requirements = [f'{x.name}{x.specifier}' for x in pkg_resources.parse_requirements(Path(file).open()) - if x.name not in exclude] - pkg_resources.require(requirements) # DistributionNotFound or VersionConflict exception if requirements not met + import pkg_resources as pkg + prefix = colorstr('red', 'bold', 'requirements:') + file = Path(file) + if not file.exists(): + print(f"{prefix} {file.resolve()} not found, check failed.") + return + + requirements = [f'{x.name}{x.specifier}' for x in pkg.parse_requirements(file.open()) if x.name not in exclude] + for r in requirements: + try: + pkg.require(r) + except Exception as e: # DistributionNotFound or VersionConflict if requirements not met + print(f"{prefix} {e.req} not found and is required by YOLOv5, attempting auto-install...") + print(subprocess.check_output(f"pip install '{e.req}'", shell=True).decode()) def check_img_size(img_size, s=32):