1*9c5db199SXin Li#!/bin/bash 2*9c5db199SXin Li# Copyright 2017 The Chromium OS Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li# 6*9c5db199SXin Li# Starts a python interpreter in virtualenv. 7*9c5db199SXin Li# 8*9c5db199SXin Li# This script will set up a virtualenv when it has not been created yet and 9*9c5db199SXin Li# executes the Python interpreter. 10*9c5db199SXin Li# 11*9c5db199SXin Li# The canonical version of this script is in infra_virtualenv repository. 12*9c5db199SXin Li# See infra_virtualenv/README.md about how to adopt virtualenv to your project. 13*9c5db199SXin Li 14*9c5db199SXin Liset -eu 15*9c5db199SXin Li 16*9c5db199SXin Li# Change this constant to the path(s) to infra_virtualenv directory when you 17*9c5db199SXin Li# copy this script to other repos. 18*9c5db199SXin Li# A path can be a relative path from this script, or an absolute path. If this 19*9c5db199SXin Li# array contains multiple paths, they are searched in the listed order. 20*9c5db199SXin Lireadonly -a infra_virtualenv_paths=( 21*9c5db199SXin Li "../../../../../infra_virtualenv" 22*9c5db199SXin Li "/opt/infra_virtualenv" 23*9c5db199SXin Li) 24*9c5db199SXin Li 25*9c5db199SXin Lireadonly bin_dir="$(readlink -e -- "$(dirname -- "$0")")" 26*9c5db199SXin Liif [[ ! -d "${bin_dir}" ]]; then 27*9c5db199SXin Li echo "ERROR: Can not locate the location of python_env!" >&2 28*9c5db199SXin Li exit 1 29*9c5db199SXin Lifi 30*9c5db199SXin Li 31*9c5db199SXin Lirealpath() { 32*9c5db199SXin Li pushd "${bin_dir}" > /dev/null 2>&1 33*9c5db199SXin Li readlink -e -- "$1" 34*9c5db199SXin Li popd > /dev/null 2>&1 35*9c5db199SXin Li} 36*9c5db199SXin Li 37*9c5db199SXin Lifind_create_venv() { 38*9c5db199SXin Li local p 39*9c5db199SXin Li for p in "${infra_virtualenv_paths[@]}"; do 40*9c5db199SXin Li local create_venv=$(realpath "${p}/bin/create_venv") 41*9c5db199SXin Li if [[ -f "${create_venv}" ]]; then 42*9c5db199SXin Li echo "${create_venv}" 43*9c5db199SXin Li break 44*9c5db199SXin Li fi 45*9c5db199SXin Li done 46*9c5db199SXin Li} 47*9c5db199SXin Li 48*9c5db199SXin Lireadonly create_venv=$(find_create_venv) 49*9c5db199SXin Liif [[ ! -f "${create_venv}" ]]; then 50*9c5db199SXin Li cat <<EOF >&2 51*9c5db199SXin LiERROR: create_venv script could not be located. 52*9c5db199SXin LiYou need to update a constant inside python_venv, or your checkout might be 53*9c5db199SXin Liincomplete. 54*9c5db199SXin LiEOF 55*9c5db199SXin Li exit 1 56*9c5db199SXin Lifi 57*9c5db199SXin Li 58*9c5db199SXin Lireadonly extra_imports_dir=$(realpath ../venv) 59*9c5db199SXin Liif [[ ! -d "${extra_imports_dir}" ]]; then 60*9c5db199SXin Li cat <<EOF >&2 61*9c5db199SXin LiERROR: ${bin_dir}/../venv does not exist 62*9c5db199SXin LiSee infra_virtualenv/README.md for details. 63*9c5db199SXin LiEOF 64*9c5db199SXin Li exit 1 65*9c5db199SXin Lifi 66*9c5db199SXin Li 67*9c5db199SXin Lireadonly venv_dir=$("${create_venv}" "${extra_imports_dir}/requirements.txt") 68*9c5db199SXin Liif [[ ! -d "${venv_dir}" ]]; then 69*9c5db199SXin Li echo "ERROR: Failed to set up a virtualenv." >&2 70*9c5db199SXin Li exit 1 71*9c5db199SXin Lifi 72*9c5db199SXin Li 73*9c5db199SXin Liexport PYTHONPATH="${extra_imports_dir}" 74*9c5db199SXin Liexec "${venv_dir}/bin/python" "$@" 75