| yangbill | 3aa2975 | 2021-04-16 16:00:28 +0800 | [diff] [blame] | 1 | #!/usr/bin/env '%interpreter%' | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 2 |  | 
|  | 3 | import os | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 4 | import tempfile | 
|  | 5 | import shutil | 
| Qiao Yang | 2a3a426 | 2023-03-22 00:17:22 +0000 | [diff] [blame] | 6 | import signal | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 7 | import sys | 
|  | 8 | import subprocess | 
|  | 9 | import zipfile | 
|  | 10 |  | 
|  | 11 | PYTHON_BINARY = '%interpreter%' | 
|  | 12 | MAIN_FILE = '%main%' | 
|  | 13 | PYTHON_PATH = 'PYTHONPATH' | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 14 |  | 
| yangbill | 7265e5f | 2019-01-04 18:10:32 +0800 | [diff] [blame] | 15 | # Don't imply 'import site' on initialization | 
|  | 16 | PYTHON_ARG = '-S' | 
|  | 17 |  | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 18 | def Main(): | 
|  | 19 | args = sys.argv[1:] | 
|  | 20 |  | 
| Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame] | 21 | runfiles_path = tempfile.mkdtemp(prefix="Soong.python_") | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 22 | try: | 
| Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame] | 23 | zf = zipfile.ZipFile(os.path.dirname(__file__)) | 
|  | 24 | zf.extractall(runfiles_path) | 
|  | 25 | zf.close() | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 26 |  | 
| Cole Faust | caf766b | 2022-10-21 16:07:56 -0700 | [diff] [blame] | 27 | new_python_path = runfiles_path | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 28 | old_python_path = os.environ.get(PYTHON_PATH) | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 29 |  | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 30 | if old_python_path: | 
| Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame] | 31 | os.environ.update({PYTHON_PATH: new_python_path + ":" + old_python_path}) | 
|  | 32 | else: | 
|  | 33 | os.environ.update({PYTHON_PATH: new_python_path}) | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 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 |  | 
| Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame] | 42 | args = [PYTHON_BINARY, PYTHON_ARG, main_filepath] + args | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 43 |  | 
|  | 44 | sys.stdout.flush() | 
| Cole Faust | d02ca05 | 2022-09-09 10:27:15 -0700 | [diff] [blame] | 45 | # close_fds=False so that you can run binaries with files provided on the command line: | 
|  | 46 | # my_python_app --file <(echo foo) | 
| Qiao Yang | 2a3a426 | 2023-03-22 00:17:22 +0000 | [diff] [blame] | 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) | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 59 | finally: | 
| Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame] | 60 | shutil.rmtree(runfiles_path, ignore_errors=True) | 
| Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 61 |  | 
|  | 62 | if __name__ == '__main__': | 
|  | 63 | Main() |