Put cros_venv inside the venv

TEST=Run versioned venv script
TEST=Run old venv script
TEST=Run tests

Change-Id: I5bd21142b6a528e97f6e739c23085d1d37265a58
Reviewed-on: https://chromium-review.googlesource.com/470709
Commit-Ready: Allen Li <ayatane@chromium.org>
Tested-by: Allen Li <ayatane@chromium.org>
Reviewed-by: Allen Li <ayatane@chromium.org>
15 files changed
tree: 52cb605c292938e79e60c8566a1a50d7ce0683b9
  1. bin/
  2. pip_packages/
  3. venv/
  4. .gitignore
  5. PRESUBMIT.cfg
  6. README.md
  7. create_venv

infra_virtualenv README

This repository provides a common Python virtualenv interface that infra code (such as chromite) can depend on.


Virtualenv users should mimic this repository, which itself uses virtualenv for running unit tests.

  1. Create a venv directory. All packages and modules in this directory will be importable inside the virtualenv.
  2. Create a requirements.txt file inside venv to list external packages to install.
  3. Copy bin/find_virtualenv.sh and bin/turtle which serve as templates.

Adding pre-built packages

To add packages to this repository, run:

$ pip wheel -w path/to/pip_packages -r path/to/requirements.txt

Commit the changes and make a CL.

Low level API

The create_venv script prepares a virtualenv using a requirements.txt file.

$ create_venv requirements.txt

The script will print the path to the virtualenv to stdout. Note that the output ends with a newline; Bash handles this, but Python does not.

To run the virtualenv Python, call bin/python under the virtualenv directory.

Together, this might look up:

$ venv=$(create_venv requirements.txt)
$ ${venv}/bin/python

NOTE: it is not generally safe to run the other scripts in the virtualenv's bin directory due to hard-coded paths. Instead of running bin/pip for example, use bin/python -m pip.

Adding arbitrary directories to import path

NOTE: Do not use this for third party dependencies (stuff not owned by ChromiumOS)! This should only be used to set up imports for stuff we own. For example, importing python-MySQL SHOULD NOT use this, but importing chromite from Autotest MAY use this.

This should be handled by the minimum amount of code in the package's __init__.py file.


"""Autotest package."""

import sys

# Use the minimum amount of logic to find the path to add
_chromite_parent = 'site-packages'

A solid understanding of the Python import system is recommended (the link is for Python 3, but it is informative).

In brief, __init__.py is executed whenever a package is imported. A package is imported before any submodule or subpackage is imported. A package is only imported once per Python process; future imports are looked up in sys.modules. Thus, __init__.py will modify sys.path exactly once and is guaranteed to be run before anything in that package is imported.