From 5e43a74c7b7c314420ffa430112f00f351f45a3a Mon Sep 17 00:00:00 2001 From: eugen-ajechiloae-clearml <97950284+eugen-ajechiloae-clearml@users.noreply.github.com> Date: Thu, 17 Feb 2022 00:04:55 +0200 Subject: [PATCH] Add requirements file support in Task.add_requirements (#575) --- clearml/backend_interface/task/task.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/clearml/backend_interface/task/task.py b/clearml/backend_interface/task/task.py index b6ab1c82..6c802e2f 100644 --- a/clearml/backend_interface/task/task.py +++ b/clearml/backend_interface/task/task.py @@ -1841,14 +1841,27 @@ class Task(IdObjectBase, AccessMixin, SetupUploadMixin): Example: Task.add_requirements('tensorflow', '>=2.4') Example: Task.add_requirements('tensorflow') -> use the installed tensorflow version Example: Task.add_requirements('tensorflow', '') -> no version limit + Alternatively, you can add all requirements from a file. + Example: Task.add_requirements('/path/to/your/project/requirements.txt') - :param str package_name: The package name to add to the "Installed Packages" section of the task. + :param str package_name: The package name or path to a requirements file + to add to the "Installed Packages" section of the task. :param package_version: The package version requirements. If ``None``, then use the installed version. """ - if not running_remotely() and hasattr(cls, 'current_task') and cls.current_task(): - get_logger('task').warning( - 'Requirement ignored, Task.add_requirements() must be called before Task.init()') - cls._force_requirements[str(package_name)] = package_version + if not running_remotely() and hasattr(cls, "current_task") and cls.current_task(): + get_logger("task").warning("Requirement ignored, Task.add_requirements() must be called before Task.init()") + if not os.path.exists(package_name): + cls._force_requirements[package_name] = package_version + return + try: + import pkg_resources + except ImportError: + get_logger("task").warning("Requirement file %s skipped since pkg_resources is not installed" % package_name) + else: + with Path(package_name).open() as requirements_txt: + for req in pkg_resources.parse_requirements(requirements_txt): + if req.marker is None or pkg_resources.evaluate_marker(str(req.marker)): + cls._force_requirements[req.name] = str(req.specifier) @classmethod def ignore_requirements(cls, package_name):