xref: /aosp_15_r20/external/autotest/bin/python_venv (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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