|  | #!/usr/bin/env '%interpreter%' | 
|  |  | 
|  | import os | 
|  | import tempfile | 
|  | import shutil | 
|  | import signal | 
|  | import sys | 
|  | import subprocess | 
|  | import zipfile | 
|  |  | 
|  | PYTHON_BINARY = '%interpreter%' | 
|  | MAIN_FILE = '%main%' | 
|  | PYTHON_PATH = 'PYTHONPATH' | 
|  |  | 
|  | # Don't imply 'import site' on initialization | 
|  | PYTHON_ARG = '-S' | 
|  |  | 
|  | def Main(): | 
|  | args = sys.argv[1:] | 
|  |  | 
|  | runfiles_path = tempfile.mkdtemp(prefix="Soong.python_") | 
|  | try: | 
|  | zf = zipfile.ZipFile(os.path.dirname(__file__)) | 
|  | zf.extractall(runfiles_path) | 
|  | zf.close() | 
|  |  | 
|  | new_python_path = runfiles_path | 
|  | old_python_path = os.environ.get(PYTHON_PATH) | 
|  |  | 
|  | if old_python_path: | 
|  | os.environ.update({PYTHON_PATH: new_python_path + ":" + old_python_path}) | 
|  | else: | 
|  | os.environ.update({PYTHON_PATH: new_python_path}) | 
|  |  | 
|  | # Now look for main python source file. | 
|  | main_filepath = os.path.join(runfiles_path, MAIN_FILE) | 
|  | assert os.path.exists(main_filepath), \ | 
|  | 'Cannot exec() %r: file not found.' % main_filepath | 
|  | assert os.access(main_filepath, os.R_OK), \ | 
|  | 'Cannot exec() %r: file not readable.' % main_filepath | 
|  |  | 
|  | args = [PYTHON_BINARY, PYTHON_ARG, main_filepath] + args | 
|  |  | 
|  | sys.stdout.flush() | 
|  | # close_fds=False so that you can run binaries with files provided on the command line: | 
|  | # my_python_app --file <(echo foo) | 
|  | p = subprocess.Popen(args, close_fds=False) | 
|  |  | 
|  | def handler(sig, frame): | 
|  | p.send_signal(sig) | 
|  |  | 
|  | # Redirect SIGINT and SIGTERM to subprocess | 
|  | signal.signal(signal.SIGINT, handler) | 
|  | signal.signal(signal.SIGTERM, handler) | 
|  |  | 
|  | p.wait() | 
|  |  | 
|  | sys.exit(p.returncode) | 
|  | finally: | 
|  | shutil.rmtree(runfiles_path, ignore_errors=True) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | Main() |