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 |
| 6 | import sys |
| 7 | import subprocess |
| 8 | import zipfile |
| 9 | |
| 10 | PYTHON_BINARY = '%interpreter%' |
| 11 | MAIN_FILE = '%main%' |
| 12 | PYTHON_PATH = 'PYTHONPATH' |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 13 | |
yangbill | 7265e5f | 2019-01-04 18:10:32 +0800 | [diff] [blame] | 14 | # Don't imply 'import site' on initialization |
| 15 | PYTHON_ARG = '-S' |
| 16 | |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 17 | def Main(): |
| 18 | args = sys.argv[1:] |
| 19 | |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 20 | runfiles_path = tempfile.mkdtemp(prefix="Soong.python_") |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 21 | try: |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 22 | zf = zipfile.ZipFile(os.path.dirname(__file__)) |
| 23 | zf.extractall(runfiles_path) |
| 24 | zf.close() |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 25 | |
| 26 | # Add runfiles path to PYTHONPATH. |
| 27 | python_path_entries = [runfiles_path] |
| 28 | |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 29 | if ADD_TOP_DIRECTORIES_TO_PATH: |
| 30 | # Add top dirs within runfiles path to PYTHONPATH. |
| 31 | top_entries = [os.path.join(runfiles_path, i) for i in os.listdir(runfiles_path)] |
| 32 | top_pkg_dirs = [i for i in top_entries if os.path.isdir(i)] |
| 33 | python_path_entries += top_pkg_dirs |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 34 | |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 35 | new_python_path = ":".join(python_path_entries) |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 36 | old_python_path = os.environ.get(PYTHON_PATH) |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 37 | |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 38 | if old_python_path: |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 39 | os.environ.update({PYTHON_PATH: new_python_path + ":" + old_python_path}) |
| 40 | else: |
| 41 | os.environ.update({PYTHON_PATH: new_python_path}) |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 42 | |
| 43 | # Now look for main python source file. |
| 44 | main_filepath = os.path.join(runfiles_path, MAIN_FILE) |
| 45 | assert os.path.exists(main_filepath), \ |
| 46 | 'Cannot exec() %r: file not found.' % main_filepath |
| 47 | assert os.access(main_filepath, os.R_OK), \ |
| 48 | 'Cannot exec() %r: file not readable.' % main_filepath |
| 49 | |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 50 | args = [PYTHON_BINARY, PYTHON_ARG, main_filepath] + args |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 51 | |
| 52 | sys.stdout.flush() |
Cole Faust | d02ca05 | 2022-09-09 10:27:15 -0700 | [diff] [blame] | 53 | # close_fds=False so that you can run binaries with files provided on the command line: |
| 54 | # my_python_app --file <(echo foo) |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 55 | sys.exit(subprocess.call(args, close_fds=False)) |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 56 | finally: |
Cole Faust | af4b13d | 2022-09-14 15:25:15 -0700 | [diff] [blame^] | 57 | shutil.rmtree(runfiles_path, ignore_errors=True) |
Nan Zhang | db0b9a3 | 2017-02-27 10:12:13 -0800 | [diff] [blame] | 58 | |
| 59 | if __name__ == '__main__': |
| 60 | Main() |