From aaa6b32f9f1eae59f744daf20eb802857d620a10 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Thu, 24 Jun 2021 19:26:35 +0300 Subject: [PATCH] Fix support for "-r requirements.txt" inside "installed packages" --- clearml_agent/commands/worker.py | 4 ++++ clearml_agent/external/requirements_parser/parser.py | 7 ++++--- clearml_agent/helper/package/requirements.py | 6 +++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/clearml_agent/commands/worker.py b/clearml_agent/commands/worker.py index 17e0949..2be68d6 100644 --- a/clearml_agent/commands/worker.py +++ b/clearml_agent/commands/worker.py @@ -2370,6 +2370,10 @@ class Worker(ServiceCommandSection): if not self.is_conda: package_api.out_of_scope_install_package('Cython') + # add support for -r in requirements + if requirements_manager: + requirements_manager.set_cwd(cwd) + cached_requirements_failed = False if cached_requirements and (cached_requirements.get('pip') is not None or cached_requirements.get('conda') is not None): diff --git a/clearml_agent/external/requirements_parser/parser.py b/clearml_agent/external/requirements_parser/parser.py index 43755dc..8669320 100644 --- a/clearml_agent/external/requirements_parser/parser.py +++ b/clearml_agent/external/requirements_parser/parser.py @@ -4,13 +4,14 @@ import warnings from .requirement import Requirement -def parse(reqstr): +def parse(reqstr, cwd=None): """ Parse a requirements file into a list of Requirements See: pip/req.py:parse_requirements() :param reqstr: a string or file like object containing requirements + :param cwd: Optional current working dir for -r file.txt loading :returns: a *generator* of Requirement objects """ filename = getattr(reqstr, 'name', None) @@ -32,8 +33,8 @@ def parse(reqstr): continue elif line.startswith('-r') or line.startswith('--requirement'): _, new_filename = line.split() - new_file_path = os.path.join(os.path.dirname(filename or '.'), - new_filename) + new_file_path = os.path.join( + os.path.dirname(filename or '.') if filename or not cwd else cwd, new_filename) with open(new_file_path) as f: for requirement in parse(f): yield requirement diff --git a/clearml_agent/helper/package/requirements.py b/clearml_agent/helper/package/requirements.py index e511e22..4086100 100644 --- a/clearml_agent/helper/package/requirements.py +++ b/clearml_agent/helper/package/requirements.py @@ -448,10 +448,14 @@ class RequirementsManager(object): self.translator = RequirementsTranslator(session, interpreter=base_interpreter, cache_dir=pip_cache_dir.as_posix()) self._base_interpreter = base_interpreter + self._cwd = None def register(self, cls): # type: (Type[RequirementSubstitution]) -> None self.handlers.append(cls(self._session)) + def set_cwd(self, cwd): + self._cwd = str(cwd) if cwd else None + def _replace_one(self, req): # type: (MarkerRequirement) -> Optional[Text] match = re.search(r';\s*(.*)', Text(req)) if match: @@ -466,7 +470,7 @@ class RequirementsManager(object): def replace(self, requirements): # type: (Text) -> Text def safe_parse(req_str): try: - return next(parse(req_str)) + return next(parse(req_str, cwd=self._cwd)) except Exception as ex: return Requirement(req_str)