 09378f56c0
			
		
	
	09378f56c0
	
	
	
		
			
			Spack is internally using a patched version of `argparse` mainly to backport Python 3 functionality into Python 2. This PR makes it such that for the supported Python 3 versions we use `argparse` from the standard Python library. This PR has been extracted from #25371 where it was needed to be able to use recent versions of `pytest`. * Fixed formatting issues when using a pristine argparse.py * Fix error message for Python 3.X when missing positional arguments * Account for the change of API in Python 3.7 * Layout multi-valued args into columns in error messages * Seamless transition in develop if argparse.pyc is in external * Be more defensive in case we can't remove the file.
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| # -*- python -*-
 | |
| #
 | |
| # Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
 | |
| # Spack Project Developers. See the top-level COPYRIGHT file for details.
 | |
| #
 | |
| # SPDX-License-Identifier: (Apache-2.0 OR MIT)
 | |
| 
 | |
| # This file is bilingual. The following shell code finds our preferred python.
 | |
| # Following line is a shell no-op, and starts a multi-line Python comment.
 | |
| # See https://stackoverflow.com/a/47886254
 | |
| """:"
 | |
| # prefer SPACK_PYTHON environment variable, python3, python, then python2
 | |
| SPACK_PREFERRED_PYTHONS="python3 python python2 /usr/libexec/platform-python"
 | |
| for cmd in "${SPACK_PYTHON:-}" ${SPACK_PREFERRED_PYTHONS}; do
 | |
|     if command -v > /dev/null "$cmd"; then
 | |
|         export SPACK_PYTHON="$(command -v "$cmd")"
 | |
|         exec "${SPACK_PYTHON}" "$0" "$@"
 | |
|     fi
 | |
| done
 | |
| 
 | |
| echo "==> Error: spack could not find a python interpreter!" >&2
 | |
| exit 1
 | |
| ":"""
 | |
| # Line above is a shell no-op, and ends a python multi-line comment.
 | |
| # The code above runs this file with our preferred python interpreter.
 | |
| 
 | |
| from __future__ import print_function
 | |
| 
 | |
| import os
 | |
| import os.path
 | |
| import sys
 | |
| 
 | |
| min_python3 = (3, 5)
 | |
| 
 | |
| if sys.version_info[:2] < (2, 6) or (
 | |
|     sys.version_info[:2] >= (3, 0) and sys.version_info[:2] < min_python3
 | |
| ):
 | |
|     v_info = sys.version_info[:3]
 | |
|     msg = "Spack requires Python 2.6, 2.7 or %d.%d or higher " % min_python3
 | |
|     msg += "You are running spack with Python %d.%d.%d." % v_info
 | |
|     sys.exit(msg)
 | |
| 
 | |
| # Find spack's location and its prefix.
 | |
| spack_file = os.path.realpath(os.path.expanduser(__file__))
 | |
| spack_prefix = os.path.dirname(os.path.dirname(spack_file))
 | |
| 
 | |
| # Allow spack libs to be imported in our scripts
 | |
| spack_lib_path = os.path.join(spack_prefix, "lib", "spack")
 | |
| sys.path.insert(0, spack_lib_path)
 | |
| 
 | |
| # Add external libs
 | |
| spack_external_libs = os.path.join(spack_lib_path, "external")
 | |
| 
 | |
| if sys.version_info[:2] <= (2, 7):
 | |
|     sys.path.insert(0, os.path.join(spack_external_libs, "py2"))
 | |
| if sys.version_info[:2] == (2, 6):
 | |
|     sys.path.insert(0, os.path.join(spack_external_libs, "py26"))
 | |
| 
 | |
| sys.path.insert(0, spack_external_libs)
 | |
| 
 | |
| # Here we delete ruamel.yaml in case it has been already imported from site
 | |
| # (see #9206 for a broader description of the issue).
 | |
| #
 | |
| # Briefly: ruamel.yaml produces a .pth file when installed with pip that
 | |
| # makes the site installed package the preferred one, even though sys.path
 | |
| # is modified to point to another version of ruamel.yaml.
 | |
| if "ruamel.yaml" in sys.modules:
 | |
|     del sys.modules["ruamel.yaml"]
 | |
| 
 | |
| if "ruamel" in sys.modules:
 | |
|     del sys.modules["ruamel"]
 | |
| 
 | |
| # The following code is here to avoid failures when updating
 | |
| # the develop version, due to spurious argparse.pyc files remaining
 | |
| # in the libs/spack/external directory, see:
 | |
| # https://github.com/spack/spack/pull/25376
 | |
| # TODO: Remove in v0.18.0 or later
 | |
| try:
 | |
|     import argparse
 | |
| except ImportError:
 | |
|     argparse_pyc = os.path.join(spack_external_libs, 'argparse.pyc')
 | |
|     if not os.path.exists(argparse_pyc):
 | |
|         raise
 | |
|     try:
 | |
|         os.remove(argparse_pyc)
 | |
|         import argparse  # noqa
 | |
|     except Exception:
 | |
|         msg = ('The file\n\n\t{0}\n\nis corrupted and cannot be deleted by Spack. '
 | |
|                'Either delete it manually or ask some administrator to '
 | |
|                'delete it for you.')
 | |
|         print(msg.format(argparse_pyc))
 | |
|         sys.exit(1)
 | |
| 
 | |
| 
 | |
| import spack.main  # noqa
 | |
| 
 | |
| # Once we've set up the system path, run the spack main method
 | |
| if __name__ == "__main__":
 | |
|     sys.exit(spack.main.main())
 |