1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
from contextlib import contextmanager
import tempfile
import subprocess
import venv
class ExtendedEnvBuilder(venv.EnvBuilder):
"""An extended env builder which saves the context, to have access
easily to bin path and such.
"""
def __init__(self, *args, **kwargs):
self.context = None
super(ExtendedEnvBuilder, self).__init__(*args, **kwargs)
def ensure_directories(self, env_dir):
self.context = super(ExtendedEnvBuilder, self).ensure_directories(env_dir)
return self.context
def create(
env_dir,
system_site_packages=False,
clear=False,
symlinks=False,
with_pip=False,
prompt=None,
):
"""Create a virtual environment in a directory."""
builder = ExtendedEnvBuilder(
system_site_packages=system_site_packages,
clear=clear,
symlinks=symlinks,
with_pip=with_pip,
prompt=prompt,
)
builder.create(env_dir)
return builder.context
@contextmanager
def create_venv_with_package(packages):
"""Create a venv with these packages in a temp dir and yielf the env.
packages should be an iterable of pip version instructio (e.g. package~=1.2.3)
"""
with tempfile.TemporaryDirectory() as tempdir:
myenv = create(tempdir, with_pip=True)
pip_call = [
myenv.env_exe,
"-m",
"pip",
"install",
]
subprocess.check_call(pip_call + ["-U", "pip"])
if packages:
subprocess.check_call(pip_call + packages)
yield myenv
|