2323import urllib .request
2424import venv
2525
26- try :
27- import pkg_resources
28- except ImportError :
29- home = os .environ ["HOME" ]
30- bb5_home = f"/gpfs/bbp.cscs.ch/home/{ os .environ ['USER' ]} "
31- if home == bb5_home :
32- print ("Error: could not find setuptools Python package." , file = sys .stderr )
33- print ("Consider loading module 'python-dev'\n " , file = sys .stderr )
34- print (" module load python-dev\n " , file = sys .stderr )
35- sys .exit (1 )
36- raise
3726
3827THIS_SCRIPT_DIR = Path (__file__ ).resolve ().parent
3928DEFAULT_RE_EXTRACT_VERSION = "([0-9]+\\ .[0-9]+(\\ .[0-9]+)?[ab]?)"
@@ -256,6 +245,7 @@ def __init__(self, path: str):
256245 """
257246 assert isinstance (path , Path )
258247 self ._path = path
248+ self .ensure_requirement ("setuptools" , restart = True )
259249
260250 @property
261251 def path (self ) -> str :
@@ -364,8 +354,7 @@ def restart_in_venv(self, reason=""):
364354 logging .debug ("Restarting process within own Python virtualenv %s" , reason )
365355 os .execv (self .interpreter , [self .interpreter ] + sys .argv )
366356
367- @classmethod
368- def is_requirement_met (cls , requirement ) -> bool :
357+ def is_requirement_met (self , requirement ) -> bool :
369358 """
370359 Args:
371360 requirement: str of pkg_resources.Requirement
@@ -375,8 +364,12 @@ def is_requirement_met(cls, requirement) -> bool:
375364 False otherwise
376365 """
377366 try :
367+ import pkg_resources
368+
378369 pkg_resources .require (str (requirement ))
379370 return True
371+ except ImportError :
372+ self ._install_requirement ("setuptools" , restart = True )
380373 except (pkg_resources .VersionConflict , pkg_resources .DistributionNotFound ):
381374 return False
382375
@@ -400,16 +393,29 @@ def ensure_requirement(self, requirement, restart=True):
400393
401394 Args:
402395 requirement: str of pkg_resources.Requirement
396+ restart: whether this process may restart after the requirement
397+ is installed.
403398 """
404- if not BBPVEnv .is_requirement_met (requirement ):
405- if self .in_venv :
406- self .pip_install (requirement )
407- if restart :
408- self .restart_in_venv (
409- f"to take into account installed requirement { requirement } "
410- )
411- else :
412- self .restart_in_venv (f"because requirement { requirement } is not met" )
399+ if not self .is_requirement_met (requirement ):
400+ self ._install_requirement (requirement , restart )
401+
402+ def _install_requirement (self , requirement , restart = False ):
403+ """
404+ Force installation of the requirement in the virtual environment
405+
406+ Args:
407+ requirement: str of pkg_resources.Requirement
408+ restart: whether this process may restart after the requirement
409+ is installed.
410+ """
411+ if self .in_venv :
412+ self .pip_install (requirement )
413+ if restart :
414+ self .restart_in_venv (
415+ f"to take into account installed requirement { requirement } "
416+ )
417+ else :
418+ self .restart_in_venv (f"because requirement { requirement } is not met" )
413419
414420
415421class Tool (metaclass = abc .ABCMeta ):
@@ -503,6 +509,8 @@ def requirement(self):
503509 name = pip_pkg
504510 else :
505511 name = self .name
512+ import pkg_resources
513+
506514 return pkg_resources .Requirement .parse (f"{ name } { self .user_config ['version' ]} " )
507515
508516 @abc .abstractmethod
@@ -771,6 +779,8 @@ def find_version(self, path: str) -> str:
771779 pkg_name = self .name
772780 if isinstance (self .config ["capabilities" ].pip_pkg , str ):
773781 pkg_name = self .config ["capabilities" ].pip_pkg
782+ import pkg_resources
783+
774784 return pkg_resources .get_distribution (pkg_name ).version
775785
776786 cmd = [path ] + self ._config ["version_opt" ]
0 commit comments