Last active
August 23, 2021 13:31
-
-
Save lrivallain/cb3cb87d4eabfb206f5cb428dc654f4f to your computer and use it in GitHub Desktop.
Python venvs with default packages installed
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
python ./venv.py myvenv | |
. myvenv/bin/activate |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import os.path | |
from subprocess import Popen, PIPE | |
import sys | |
from threading import Thread | |
from urllib.parse import urlparse | |
from urllib.request import urlretrieve | |
import venv | |
import pip | |
default_packages = [ | |
'ptpython', | |
] | |
class ExtendedEnvBuilder(venv.EnvBuilder): | |
""" | |
""" | |
def __init__(self, *args, **kwargs): | |
self.verbose = kwargs.pop('verbose', False) | |
super().__init__(*args, **kwargs) | |
def post_setup(self, context): | |
""" | |
Set up any packages which need to be pre-installed into the | |
virtual environment being created. | |
:param context: The information for the virtual environment | |
creation request being processed. | |
""" | |
os.environ['VIRTUAL_ENV'] = context.env_dir | |
for package in default_packages: | |
pip.main(['install', package]) | |
def main(args=None): | |
compatible = True | |
if sys.version_info < (3, 3): | |
compatible = False | |
elif not hasattr(sys, 'base_prefix'): | |
compatible = False | |
if not compatible: | |
raise ValueError('This script is only for use with ' | |
'Python 3.3 or later') | |
else: | |
import argparse | |
parser = argparse.ArgumentParser(prog=__name__, | |
description='Creates virtual Python ' | |
'environments in one or ' | |
'more target ' | |
'directories.') | |
parser.add_argument('dirs', metavar='ENV_DIR', nargs='+', | |
help='A directory in which to create the' | |
'virtual environment.') | |
parser.add_argument('--system-site-packages', default=False, | |
action='store_true', dest='system_site', | |
help='Give the virtual environment access to the ' | |
'system site-packages dir.') | |
if os.name == 'nt': | |
use_symlinks = False | |
else: | |
use_symlinks = True | |
parser.add_argument('--symlinks', default=use_symlinks, | |
action='store_true', dest='symlinks', | |
help='Try to use symlinks rather than copies, ' | |
'when symlinks are not the default for ' | |
'the platform.') | |
parser.add_argument('--clear', default=False, action='store_true', | |
dest='clear', help='Delete the contents of the ' | |
'virtual environment ' | |
'directory if it already ' | |
'exists, before virtual ' | |
'environment creation.') | |
parser.add_argument('--upgrade', default=False, action='store_true', | |
dest='upgrade', help='Upgrade the virtual ' | |
'environment directory to ' | |
'use this version of ' | |
'Python, assuming Python ' | |
'has been upgraded ' | |
'in-place.') | |
parser.add_argument('--verbose', default=False, action='store_true', | |
dest='verbose', help='Display the output ' | |
'from the scripts which ' | |
'install setuptools and pip.') | |
options = parser.parse_args(args) | |
if options.upgrade and options.clear: | |
raise ValueError('you cannot supply --upgrade and --clear together.') | |
builder = ExtendedEnvBuilder(system_site_packages=options.system_site, | |
clear=options.clear, | |
symlinks=options.symlinks, | |
upgrade=options.upgrade, | |
verbose=options.verbose) | |
for d in options.dirs: | |
builder.create(d) | |
if __name__ == '__main__': | |
rc = 1 | |
try: | |
main() | |
rc = 0 | |
except Exception as e: | |
print('Error: %s' % e, file=sys.stderr) | |
sys.exit(rc) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment