diff --git a/clearml_agent/backend_api/config/default/agent.conf b/clearml_agent/backend_api/config/default/agent.conf index 835a3b6..3b979b3 100644 --- a/clearml_agent/backend_api/config/default/agent.conf +++ b/clearml_agent/backend_api/config/default/agent.conf @@ -66,7 +66,7 @@ type: pip, # specify pip version to use (examples "<20.2", "==19.3.1", "", empty string will install the latest version) - pip_version: "<21", + pip_version: ["<20.2 ; python_version < '3.10'", "<22.3 ; python_version >= '3.10'"], # specify poetry version to use (examples "<2", "==1.1.1", "", empty string will install the latest version) # poetry_version: "<2", diff --git a/clearml_agent/commands/worker.py b/clearml_agent/commands/worker.py index 42e0c3b..c090dc2 100644 --- a/clearml_agent/commands/worker.py +++ b/clearml_agent/commands/worker.py @@ -3875,10 +3875,10 @@ class Worker(ServiceCommandSection): update_scheme += ( docker_bash_script + " ; " + "[ ! -z $LOCAL_PYTHON ] || export LOCAL_PYTHON={python} ; " + - "$LOCAL_PYTHON -m pip install -U \"pip{pip_version}\" ; " + + "$LOCAL_PYTHON -m pip install -U {pip_version} ; " + "$LOCAL_PYTHON -m pip install -U {clearml_agent_wheel} ; ").format( python_single_digit=python_version.split('.')[0], - python=python_version, pip_version=PackageManager.get_pip_version(), + python=python_version, pip_version=" ".join(PackageManager.get_pip_versions(wrap='\"')), clearml_agent_wheel=clearml_agent_wheel, mount_ssh_ro=mount_ssh_ro, mount_ssh=mount_ssh, ) diff --git a/clearml_agent/helper/package/base.py b/clearml_agent/helper/package/base.py index cfc9a0e..dd6190f 100644 --- a/clearml_agent/helper/package/base.py +++ b/clearml_agent/helper/package/base.py @@ -80,7 +80,12 @@ class PackageManager(object): def upgrade_pip(self): result = self._install( - select_for_platform(windows='pip{}', linux='pip{}').format(self.get_pip_version()), "--upgrade") + *select_for_platform( + windows=self.get_pip_versions(), + linux=self.get_pip_versions() + ), + "--upgrade" + ) packages = self.run_with_env(('list',), output=True).splitlines() # p.split is ('pip', 'x.y.z') pip = [p.split() for p in packages if len(p.split()) == 2 and p.split()[0] == 'pip'] @@ -157,15 +162,26 @@ class PackageManager(object): def set_pip_version(cls, version): if not version: return - version = version.replace(' ', '') - if ('=' in version) or ('~' in version) or ('<' in version) or ('>' in version): - cls._pip_version = version + + if isinstance(version, (list, tuple)): + versions = version else: - cls._pip_version = "=="+version + versions = [version] + + cls._pip_version = [] + for version in versions: + version = version.strip() + if ('=' in version) or ('~' in version) or ('<' in version) or ('>' in version): + cls._pip_version.append(version) + else: + cls._pip_version.append("==" + version) @classmethod - def get_pip_version(cls): - return cls._pip_version or '' + def get_pip_versions(cls, pip="pip", wrap='"'): + return [ + (wrap + pip + version + wrap) + for version in cls._pip_version or [pip] + ] def get_cached_venv(self, requirements, docker_cmd, python_version, cuda_version, destination_folder): # type: (Dict, Optional[Union[dict, str]], Optional[str], Optional[str], Path) -> Optional[Path] diff --git a/clearml_agent/helper/package/conda_api.py b/clearml_agent/helper/package/conda_api.py index dd2dee7..9c39a03 100644 --- a/clearml_agent/helper/package/conda_api.py +++ b/clearml_agent/helper/package/conda_api.py @@ -135,7 +135,12 @@ class CondaAPI(PackageManager): if self.env_read_only: print('Conda environment in read-only mode, skipping pip upgrade.') return '' - return self._install(select_for_platform(windows='pip{}', linux='pip{}').format(self.pip.get_pip_version())) + return self._install( + *select_for_platform( + windows=self.pip.get_pip_versions(), + linux=self.pip.get_pip_versions() + ) + ) def create(self): """ diff --git a/docs/clearml.conf b/docs/clearml.conf index f211d25..fdb4b09 100644 --- a/docs/clearml.conf +++ b/docs/clearml.conf @@ -79,7 +79,7 @@ agent { type: pip, # specify pip version to use (examples "<20.2", "==19.3.1", "", empty string will install the latest version) - # pip_version: "<21" + # pip_version: ["<20.2 ; python_version < '3.10'", "<22.3 ; python_version >= '3.10'"] # specify poetry version to use (examples "<2", "==1.1.1", "", empty string will install the latest version) # poetry_version: "<2",