| #!/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() |