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