From f9f28e8fbaaf6bbc3fa72050bfce34d6fad25173 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 16 Jan 2020 15:46:18 -0600 Subject: Fix use of sys.executable for module/env commands (#14496) * Fix use of sys.executable for module/env commands * Fix unit tests * More consistent quotation, less duplication * Fix import syntax --- lib/spack/spack/util/environment.py | 5 +++-- lib/spack/spack/util/module_cmd.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index f7dc728e7c..83b350d1c7 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -17,6 +17,7 @@ import six import llnl.util.tty as tty import spack.util.executable as executable +from spack.util.module_cmd import py_cmd from llnl.util.lang import dedupe @@ -918,8 +919,8 @@ def environment_after_sourcing_files(*files, **kwargs): source_file.extend(x for x in file_and_args) source_file = ' '.join(source_file) - dump_cmd = 'import os, json; print(json.dumps(dict(os.environ)))' - dump_environment = sys.executable + ' -c "{0}"'.format(dump_cmd) + dump_environment = 'PYTHONHOME="{0}" "{1}" -c "{2}"'.format( + sys.prefix, sys.executable, py_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 d203670769..1781e05032 100644 --- a/lib/spack/spack/util/module_cmd.py +++ b/lib/spack/spack/util/module_cmd.py @@ -18,7 +18,7 @@ import llnl.util.tty as tty # This list is not exhaustive. Currently we only use load and unload # If we need another option that changes the environment, add it here. module_change_commands = ['load', 'swap', 'unload', 'purge', 'use', 'unuse'] -py_cmd = "'import os;import json;print(json.dumps(dict(os.environ)))'" +py_cmd = 'import os; import json; print(json.dumps(dict(os.environ)))' # This is just to enable testing. I hate it but we can't find a better way _test_mode = False @@ -32,7 +32,8 @@ def module(*args): if args[0] in module_change_commands: # Do the module manipulation, then output the environment in JSON # and read the JSON back in the parent process to update os.environ - module_cmd += ' >/dev/null;' + sys.executable + ' -c %s' % py_cmd + module_cmd += ' > /dev/null; PYTHONHOME="{0}" "{1}" -c "{2}"'.format( + sys.prefix, sys.executable, py_cmd) module_p = subprocess.Popen(module_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, -- cgit v1.2.3-60-g2f50