1#!/usr/bin/env '%interpreter%' 2 3import os 4import tempfile 5import shutil 6import signal 7import sys 8import subprocess 9import zipfile 10 11PYTHON_BINARY = '%interpreter%' 12MAIN_FILE = '%main%' 13PYTHON_PATH = 'PYTHONPATH' 14 15# Don't imply 'import site' on initialization 16PYTHON_ARG = '-S' 17 18def Main(): 19 args = sys.argv[1:] 20 21 runfiles_path = tempfile.mkdtemp(prefix="Soong.python_") 22 try: 23 zf = zipfile.ZipFile(os.path.dirname(__file__)) 24 zf.extractall(runfiles_path) 25 zf.close() 26 27 new_python_path = runfiles_path 28 old_python_path = os.environ.get(PYTHON_PATH) 29 30 if old_python_path: 31 os.environ.update({PYTHON_PATH: new_python_path + ":" + old_python_path}) 32 else: 33 os.environ.update({PYTHON_PATH: new_python_path}) 34 35 # Now look for main python source file. 36 main_filepath = os.path.join(runfiles_path, MAIN_FILE) 37 assert os.path.exists(main_filepath), \ 38 'Cannot exec() %r: file not found.' % main_filepath 39 assert os.access(main_filepath, os.R_OK), \ 40 'Cannot exec() %r: file not readable.' % main_filepath 41 42 args = [PYTHON_BINARY, PYTHON_ARG, main_filepath] + args 43 44 sys.stdout.flush() 45 # close_fds=False so that you can run binaries with files provided on the command line: 46 # my_python_app --file <(echo foo) 47 p = subprocess.Popen(args, close_fds=False) 48 49 def handler(sig, frame): 50 p.send_signal(sig) 51 52 # Redirect SIGINT and SIGTERM to subprocess 53 signal.signal(signal.SIGINT, handler) 54 signal.signal(signal.SIGTERM, handler) 55 56 p.wait() 57 58 sys.exit(p.returncode) 59 finally: 60 shutil.rmtree(runfiles_path, ignore_errors=True) 61 62if __name__ == '__main__': 63 Main() 64