Consolidate definition of Spack's extra sys.path components (#41816)

To work properly, Spack requires a few directories from its repository to be added to
`sys.path`. Previously these were buried in `spack_installable.main.main()`, but it's
sometimes useful to get the paths separately, e.g., if you want to set up your own
functioning spack environment.

With this change, adding the paths is much simpler:

```python
import spack_installable
sys.path[:0] = get_spack_sys_paths(spack_prefix)
```

- [x] Add `get_spack_sys_paths()` method with extra paths in order.
- [x] Refactor `spack_installable.main.main()` to use it.
This commit is contained in:
Todd Gamblin 2023-12-21 16:25:12 -08:00 committed by GitHub
parent 94fc2314f1
commit 0da1fae709
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -7,19 +7,24 @@
from os.path import dirname as dn from os.path import dirname as dn
def get_spack_sys_paths(spack_prefix):
"""Given a spack prefix, return all the paths Spack needs to function."""
spack_libs = os.path.join(spack_prefix, "lib", "spack")
external_libs = os.path.join(spack_libs, "external")
vendored_libs = os.path.join(external_libs, "_vendoring")
# spack externals take precedence, then vendored packages, then spack itself
return [external_libs, vendored_libs, spack_libs]
def main(argv=None): def main(argv=None):
# Find spack's location and its prefix. # Find spack's location and its prefix.
this_file = os.path.realpath(os.path.expanduser(__file__)) this_file = os.path.realpath(os.path.expanduser(__file__))
spack_prefix = dn(dn(dn(dn(this_file)))) spack_prefix = dn(dn(dn(dn(this_file))))
# Allow spack libs to be imported in our scripts # Add all the sys paths that allow spack libs to be imported
spack_lib_path = os.path.join(spack_prefix, "lib", "spack") sys.path[:0] = get_spack_sys_paths(spack_prefix)
sys.path.insert(0, spack_lib_path)
# Add external libs
spack_external_libs = os.path.join(spack_lib_path, "external")
sys.path.insert(0, os.path.join(spack_external_libs, "_vendoring"))
sys.path.insert(0, spack_external_libs)
# Here we delete ruamel.yaml in case it has been already imported from site # Here we delete ruamel.yaml in case it has been already imported from site
# (see #9206 for a broader description of the issue). # (see #9206 for a broader description of the issue).
# #