Skip to content

Commit 82b157f

Browse files
authored
cpp/lib.py: works without setuptools installed (#150)
cpp/lib.py: work without setuptools installed the `setuptools` package is now installed in the virtualenv if missing
1 parent 8de7a0b commit 82b157f

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed

cpp/lib.py

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,6 @@
2323
import urllib.request
2424
import 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

3827
THIS_SCRIPT_DIR = Path(__file__).resolve().parent
3928
DEFAULT_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

415421
class 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

Comments
 (0)