From 04208e7c79e52e2db905b973ab018deec6782260 Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Tue, 29 Nov 2016 16:08:57 +1100 Subject: [PATCH] Activate virtualenv in disk-image-create Because we're still fundamentally a python program calling a shell-script, there's some oddities like not having the virtualenv bin/ in the $PATH if we call disk-image-create directly. We can detect this, however, and activate the virtualenv before we fork the disk-image-create shell script so everything "just works". See also nodepool change I0537cbf167bb18edf26f84ac269cbd9c8a1ea6a2 Change-Id: Ibfea6cf6a6fd0c7f1e468d501c61ae0b58992042 --- diskimage_builder/disk_image_create.py | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/diskimage_builder/disk_image_create.py b/diskimage_builder/disk_image_create.py index 45ce47a2..fba2bdc0 100644 --- a/diskimage_builder/disk_image_create.py +++ b/diskimage_builder/disk_image_create.py @@ -19,7 +19,39 @@ import sys import diskimage_builder.paths +# borrowed from pip:locations.py +def running_under_virtualenv(): + """Return True if we're running inside a virtualenv, False otherwise.""" + if hasattr(sys, 'real_prefix'): + return True + elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): + return True + return False + + +def activate_venv(): + if running_under_virtualenv(): + activate_this = os.path.join(sys.prefix, "bin", "activate_this.py") + execfile(activate_this, dict(__file__=activate_this)) + + def main(): + # If we are called directly from a venv install + # (/path/venv/bin/disk-image-create) then nothing has added the + # virtualenv bin/ dir to $PATH. the exec'd script below will be + # unable to find call other dib tools like dib-run-parts. + # + # One solution is to say that you should only ever run + # disk-image-create in a shell that has already sourced + # bin/activate.sh (all this really does is add /path/venv/bin to + # $PATH). That's not a great interface as resulting errors will + # be very non-obvious. + # + # We can detect if we are running in a virtualenv and use + # virtualenv's "activate_this.py" script to activate it ourselves + # before we call the script. This ensures we have the path setting + activate_venv() + environ = os.environ # pre-seed some paths for the shell script