From 0d6a2381b27ba10568a5f2d9c1d0e50a23d368fd Mon Sep 17 00:00:00 2001 From: Jordan Galby <67924449+Jordan474@users.noreply.github.com> Date: Sun, 3 Oct 2021 16:10:33 +0200 Subject: Fix JSONDecodeError when using compiler modules (#25624) When using modules for compiler (and/or external package), if a package's `setup_[dependent_]build_environment` sets `PYTHONHOME`, it can influence the python subprocess executed to gather module information. The error seen was: ``` json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) ``` But the actual hidden error happened in the `python -c 'import json...'` subprocess, which made it return an empty string as json: ``` ModuleNotFoundError: No module named 'encodings' ``` This fix uses `python -E` to ignore `PYTHONHOME` and `PYTHONPATH`. Should be safe here because the python subprocess code only use packages built-in python. The python subprocess in `environment.py` was also patched to be safe and consistent. --- lib/spack/spack/util/environment.py | 2 +- lib/spack/spack/util/module_cmd.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index 073f60334e..075d7e88ea 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -989,7 +989,7 @@ def environment_after_sourcing_files(*files, **kwargs): python_cmd = python_cmd.name if python_cmd else sys.executable dump_cmd = 'import os, json; print(json.dumps(dict(os.environ)))' - dump_environment = python_cmd + ' -c "{0}"'.format(dump_cmd) + dump_environment = python_cmd + ' -E -c "{0}"'.format(dump_cmd) # Try to source the file source_file_arguments = ' '.join([ diff --git a/lib/spack/spack/util/module_cmd.py b/lib/spack/spack/util/module_cmd.py index d8c3ec8d14..b3c3db9b93 100644 --- a/lib/spack/spack/util/module_cmd.py +++ b/lib/spack/spack/util/module_cmd.py @@ -47,7 +47,7 @@ def module(*args): module_cmd += 'LD_LIBRARY_PATH="$SPACK_LD_LIBRARY_PATH" ' # Execute the python command - module_cmd += '%s -c "%s";' % (sys.executable, py_cmd) + module_cmd += '%s -E -c "%s";' % (sys.executable, py_cmd) # If LD_LIBRARY_PATH was set after `module`, dump the old value because # we have since corrupted it to ensure python would run. -- cgit v1.2.3-70-g09d2