| #!/bin/bash | |
| # Copyright 2017 The Chromium OS Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # | |
| # Starts a python interpreter in virtualenv. | |
| # | |
| # This script will set up a virtualenv when it has not been created yet and | |
| # executes the Python interpreter. | |
| # | |
| # The canonical version of this script is in infra_virtualenv repository. | |
| # See infra_virtualenv/README.md about how to adopt virtualenv to your project. | |
| set -eu | |
| # Change this constant to the path(s) to infra_virtualenv directory when you | |
| # copy this script to other repos. | |
| # A path can be a relative path from this script, or an absolute path. If this | |
| # array contains multiple paths, they are searched in the listed order. | |
| readonly -a infra_virtualenv_paths=( | |
| "../../../../../infra_virtualenv" | |
| "/opt/infra_virtualenv" | |
| ) | |
| readonly bin_dir="$(readlink -e -- "$(dirname -- "$0")")" | |
| if [[ ! -d "${bin_dir}" ]]; then | |
| echo "ERROR: Can not locate the location of python_env!" >&2 | |
| exit 1 | |
| fi | |
| realpath() { | |
| pushd "${bin_dir}" > /dev/null 2>&1 | |
| readlink -e -- "$1" | |
| popd > /dev/null 2>&1 | |
| } | |
| find_create_venv() { | |
| local p | |
| for p in "${infra_virtualenv_paths[@]}"; do | |
| local create_venv=$(realpath "${p}/bin/create_venv") | |
| if [[ -f "${create_venv}" ]]; then | |
| echo "${create_venv}" | |
| break | |
| fi | |
| done | |
| } | |
| readonly create_venv=$(find_create_venv) | |
| if [[ ! -f "${create_venv}" ]]; then | |
| cat <<EOF >&2 | |
| ERROR: create_venv script could not be located. | |
| You need to update a constant inside python_venv, or your checkout might be | |
| incomplete. | |
| EOF | |
| exit 1 | |
| fi | |
| readonly extra_imports_dir=$(realpath ../venv) | |
| if [[ ! -d "${extra_imports_dir}" ]]; then | |
| cat <<EOF >&2 | |
| ERROR: ${bin_dir}/../venv does not exist | |
| See infra_virtualenv/README.md for details. | |
| EOF | |
| exit 1 | |
| fi | |
| readonly venv_dir=$("${create_venv}" "${extra_imports_dir}/requirements.txt") | |
| if [[ ! -d "${venv_dir}" ]]; then | |
| echo "ERROR: Failed to set up a virtualenv." >&2 | |
| exit 1 | |
| fi | |
| export PYTHONPATH="${extra_imports_dir}" | |
| exec "${venv_dir}/bin/python" "$@" |