From 8c30f6ba11b500b69776d98447216008d14b67c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 22 Nov 2024 16:53:36 +0100 Subject: [PATCH 1/5] Move sitecustomize.py into site-packages --- easybuild/easyblocks/p/python.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/easybuild/easyblocks/p/python.py b/easybuild/easyblocks/p/python.py index 01355b23e5..f7372845a8 100644 --- a/easybuild/easyblocks/p/python.py +++ b/easybuild/easyblocks/p/python.py @@ -142,9 +142,6 @@ def __init__(self, *args, **kwargs): self.pyshortver = '.'.join(self.version.split('.')[:2]) - # Used for EBPYTHONPREFIXES handler script - self.pythonpath = os.path.join(log_path(), 'python') - ext_defaults = { # Use PYPI_SOURCE as the default for source_urls of extensions. 'source_urls': [PYPI_SOURCE], @@ -504,7 +501,8 @@ def install_step(self): symlink('pip' + self.pyshortver, pip_binary_path, use_abspath_source=False) if self.cfg.get('ebpythonprefixes'): - write_file(os.path.join(self.installdir, self.pythonpath, 'sitecustomize.py'), SITECUSTOMIZE) + site_packages_path = os.path.join('lib', 'python' + self.pyshortver, 'site-packages') + write_file(os.path.join(self.installdir, site_packages_path, 'sitecustomize.py'), SITECUSTOMIZE) # symlink lib/python*/lib-dynload to lib64/python*/lib-dynload if it doesn't exist; # see https://github.com/easybuilders/easybuild-easyblocks/issues/1957 @@ -640,7 +638,16 @@ def make_module_extra(self, *args, **kwargs): """Add path to sitecustomize.py to $PYTHONPATH""" txt = super(EB_Python, self).make_module_extra() + # Legacy support for existing installations doing "--rebuild --module-only" if self.cfg.get('ebpythonprefixes'): - txt += self.module_generator.prepend_paths(PYTHONPATH, self.pythonpath) + new_dir = os.path.join('lib', 'python' + self.pyshortver, 'site-packages') + old_dir = os.path.join(log_path(), 'python') + if not os.path.exists(os.path.join(self.installdir, new_dir, 'sitecustomize.py')): + if not os.path.exists(os.path.join(self.installdir, old_dir, 'sitecustomize.py')): + raise EasyBuildError("sitecustomize.py is missing from installation.") + else: + txt += self.module_generator.prepend_paths(PYTHONPATH, os.path.join(self.installdir, old_dir)) + + return txt From f573a3978502e315554a097f68833fa53ca6adf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 22 Nov 2024 17:45:42 +0100 Subject: [PATCH 2/5] Remove error since it breaks CI --- easybuild/easyblocks/p/python.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/easybuild/easyblocks/p/python.py b/easybuild/easyblocks/p/python.py index f7372845a8..f4f66dfbb8 100644 --- a/easybuild/easyblocks/p/python.py +++ b/easybuild/easyblocks/p/python.py @@ -643,11 +643,6 @@ def make_module_extra(self, *args, **kwargs): new_dir = os.path.join('lib', 'python' + self.pyshortver, 'site-packages') old_dir = os.path.join(log_path(), 'python') if not os.path.exists(os.path.join(self.installdir, new_dir, 'sitecustomize.py')): - if not os.path.exists(os.path.join(self.installdir, old_dir, 'sitecustomize.py')): - raise EasyBuildError("sitecustomize.py is missing from installation.") - else: - txt += self.module_generator.prepend_paths(PYTHONPATH, os.path.join(self.installdir, old_dir)) - - + txt += self.module_generator.prepend_paths(PYTHONPATH, os.path.join(self.installdir, old_dir)) return txt From db0e35b05346ab964182121e71fee220ba7c6157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 22 Nov 2024 17:51:03 +0100 Subject: [PATCH 3/5] Fix using relative path --- easybuild/easyblocks/p/python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/easyblocks/p/python.py b/easybuild/easyblocks/p/python.py index f4f66dfbb8..0d2b61d106 100644 --- a/easybuild/easyblocks/p/python.py +++ b/easybuild/easyblocks/p/python.py @@ -643,6 +643,6 @@ def make_module_extra(self, *args, **kwargs): new_dir = os.path.join('lib', 'python' + self.pyshortver, 'site-packages') old_dir = os.path.join(log_path(), 'python') if not os.path.exists(os.path.join(self.installdir, new_dir, 'sitecustomize.py')): - txt += self.module_generator.prepend_paths(PYTHONPATH, os.path.join(self.installdir, old_dir)) + txt += self.module_generator.prepend_paths(PYTHONPATH, old_dir) return txt From f536db32b965c302cd58b6d8445d633f959957f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Sun, 15 Dec 2024 17:07:07 +0100 Subject: [PATCH 4/5] Remove backwards compat for module only rebuilds. Also uses property to clean up small code duplication --- easybuild/easyblocks/p/python.py | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/easybuild/easyblocks/p/python.py b/easybuild/easyblocks/p/python.py index 0d2b61d106..8cb78b2bcf 100644 --- a/easybuild/easyblocks/p/python.py +++ b/easybuild/easyblocks/p/python.py @@ -478,6 +478,10 @@ def build_step(self, *args, **kwargs): super(EB_Python, self).build_step(*args, **kwargs) + @property + def site_packages_path(self): + return os.path.join('lib', 'python' + self.pyshortver, 'site-packages') + def install_step(self): """Extend make install to make sure that the 'python' command is present.""" @@ -501,8 +505,7 @@ def install_step(self): symlink('pip' + self.pyshortver, pip_binary_path, use_abspath_source=False) if self.cfg.get('ebpythonprefixes'): - site_packages_path = os.path.join('lib', 'python' + self.pyshortver, 'site-packages') - write_file(os.path.join(self.installdir, site_packages_path, 'sitecustomize.py'), SITECUSTOMIZE) + write_file(os.path.join(self.installdir, self.site_packages_path, 'sitecustomize.py'), SITECUSTOMIZE) # symlink lib/python*/lib-dynload to lib64/python*/lib-dynload if it doesn't exist; # see https://github.com/easybuilders/easybuild-easyblocks/issues/1957 @@ -523,8 +526,7 @@ def install_step(self): def _sanity_check_ebpythonprefixes(self): """Check that EBPYTHONPREFIXES works""" temp_prefix = tempfile.mkdtemp(suffix='-tmp-prefix') - site_packages_path = os.path.join('lib', 'python' + self.pyshortver, 'site-packages') - temp_site_packages_path = os.path.join(temp_prefix, site_packages_path) + temp_site_packages_path = os.path.join(temp_prefix, self.site_packages_path) mkdir(temp_site_packages_path, parents=True) # Must exist res = run_shell_cmd("%s=%s python -c 'import sys; print(sys.path)'" % (EBPYTHONPREFIXES, temp_prefix)) out = res.output.strip() @@ -532,7 +534,7 @@ def _sanity_check_ebpythonprefixes(self): if not out.startswith('[') or not out.endswith(']'): raise EasyBuildError("Unexpected output for sys.path: %s", out) paths = eval(out) - base_site_packages_path = os.path.join(self.installdir, site_packages_path) + base_site_packages_path = os.path.join(self.installdir, self.site_packages_path) try: base_prefix_idx = paths.index(base_site_packages_path) except ValueError: @@ -633,16 +635,3 @@ def sanity_check_step(self): raise EasyBuildError("Expected to find exactly one _tkinter*.so: %s", tkinter_so_hits) super(EB_Python, self).sanity_check_step(custom_paths=custom_paths, custom_commands=custom_commands) - - def make_module_extra(self, *args, **kwargs): - """Add path to sitecustomize.py to $PYTHONPATH""" - txt = super(EB_Python, self).make_module_extra() - - # Legacy support for existing installations doing "--rebuild --module-only" - if self.cfg.get('ebpythonprefixes'): - new_dir = os.path.join('lib', 'python' + self.pyshortver, 'site-packages') - old_dir = os.path.join(log_path(), 'python') - if not os.path.exists(os.path.join(self.installdir, new_dir, 'sitecustomize.py')): - txt += self.module_generator.prepend_paths(PYTHONPATH, old_dir) - - return txt From 51b25e537df326b383b6d85ac70a5672c4046455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Wed, 18 Dec 2024 09:13:19 +0100 Subject: [PATCH 5/5] Drop unused imports --- easybuild/easyblocks/p/python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/easyblocks/p/python.py b/easybuild/easyblocks/p/python.py index 8cb78b2bcf..824a44dd11 100644 --- a/easybuild/easyblocks/p/python.py +++ b/easybuild/easyblocks/p/python.py @@ -45,7 +45,7 @@ from easybuild.framework.easyconfig import CUSTOM from easybuild.framework.easyconfig.templates import PYPI_SOURCE from easybuild.tools.build_log import EasyBuildError, print_warning -from easybuild.tools.config import build_option, ERROR, log_path, PYTHONPATH, EBPYTHONPREFIXES +from easybuild.tools.config import build_option, ERROR, EBPYTHONPREFIXES from easybuild.tools.modules import get_software_libdir, get_software_root, get_software_version from easybuild.tools.filetools import apply_regex_substitutions, change_dir, mkdir from easybuild.tools.filetools import read_file, remove_dir, symlink, write_file