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