From adf4f97eded5287caea0fec14173860a1dfaa3a7 Mon Sep 17 00:00:00 2001 From: Patrick Avery Date: Wed, 6 Apr 2022 21:07:56 -0500 Subject: [PATCH] feat(venv): add trame.env.venv This works identically to the paraview web venv. You specify either the arguments "--venv " or the "TRAME_VENV" environment variable. Then, if `trame.env.venv` is imported, that virtual environment path will be used instead of the original one. Signed-off-by: Patrick Avery --- trame/env/venv.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 trame/env/venv.py diff --git a/trame/env/venv.py b/trame/env/venv.py new file mode 100644 index 00000000..60f68a19 --- /dev/null +++ b/trame/env/venv.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +"""Activate venv for current interpreter: + +Use `import trame.env.venv` along one of the following + - `--venv /path/to/venv/base` argument + - environment variable `TRAME_VENV=/path/to/venv/base` + +This can be used when you must use an existing Python interpreter, not the venv bin/python. +""" +import os +import site +import sys + +VENV_BASE = None +VENV_LOADED = False + +if os.environ.get("TRAME_VENV"): + VENV_BASE = os.path.abspath(os.environ.get("TRAME_VENV")) + +if "--venv" in sys.argv: + VENV_BASE = os.path.abspath(sys.argv[sys.argv.index("--venv") + 1]) + +if not VENV_LOADED and VENV_BASE and os.path.exists(VENV_BASE): + VENV_LOADED = True + # Code inspired by virutal-env::bin/active_this.py + bin_dir = os.path.join(VENV_BASE, "bin") + os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + os.environ["VIRTUAL_ENV"] = VENV_BASE + prev_length = len(sys.path) + python_libs = os.path.join(VENV_BASE, f"lib/python{sys.version_info.major}.{sys.version_info.minor}/site-packages") + site.addsitedir(python_libs) + sys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length] + sys.real_prefix = sys.prefix + sys.prefix = VENV_BASE + # + print(f"Trame is using venv: {VENV_BASE}")