platform_build_soong/python/scripts/stub_template_host.txt
yangbill 7265e5f9c1 Pass -S option to wrapper for python binary.
Prevent problem for some users using PAR file built by android's
build system which cause by the different site package of python
installed by user themselves.

Bug: 120469915
Test: 1. m atest
         atest --help
      2. apply aosp/861470
         full build

Change-Id: I72c83f9397f0e88eecfcd32806f1746520299447
2019-01-04 18:10:32 +08:00

93 lines
2.6 KiB
Python

#!/usr/bin/env python
import os
import re
import tempfile
import shutil
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 SearchPathEnv(name):
search_path = os.getenv('PATH', os.defpath).split(os.pathsep)
for directory in search_path:
if directory == '': continue
path = os.path.join(directory, name)
# Check if path is actual executable file.
if os.path.isfile(path) and os.access(path, os.X_OK):
return path
return None
def FindPythonBinary():
if PYTHON_BINARY.startswith('/'):
# Case 1: Python interpreter is directly provided with absolute path.
return PYTHON_BINARY
else:
# Case 2: Find Python interpreter through environment variable: PATH.
return SearchPathEnv(PYTHON_BINARY)
# Create the runfiles tree by extracting the zip file
def ExtractRunfiles():
temp_dir = tempfile.mkdtemp("", "Soong.python_")
zf = zipfile.ZipFile(os.path.dirname(__file__))
zf.extractall(temp_dir)
return temp_dir
def Main():
args = sys.argv[1:]
new_env = {}
runfiles_path = None
try:
runfiles_path = ExtractRunfiles()
# Add runfiles path to PYTHONPATH.
python_path_entries = [runfiles_path]
# Add top dirs within runfiles path to PYTHONPATH.
top_entries = [os.path.join(runfiles_path, i) for i in os.listdir(runfiles_path)]
top_pkg_dirs = [i for i in top_entries if os.path.isdir(i)]
python_path_entries += top_pkg_dirs
old_python_path = os.environ.get(PYTHON_PATH)
separator = ':'
new_python_path = separator.join(python_path_entries)
# Copy old PYTHONPATH.
if old_python_path:
new_python_path += separator + old_python_path
new_env[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
python_program = FindPythonBinary()
if python_program is None:
raise AssertionError('Could not find python binary: ' + PYTHON_BINARY)
args = [python_program, PYTHON_ARG, main_filepath] + args
os.environ.update(new_env)
sys.stdout.flush()
retCode = subprocess.call(args)
exit(retCode)
except:
raise
finally:
if runfiles_path is not None:
shutil.rmtree(runfiles_path, True)
if __name__ == '__main__':
Main()