cpython: 57fbab22ab4e (original) (raw)

Mercurial > cpython

changeset 87341:57fbab22ab4e

Close #19552: venv and pyvenv ensurepip integration [#19552]

Nick Coghlan ncoghlan@gmail.com
date Sat, 23 Nov 2013 00:30:34 +1000
parents 4051f2dcd99b
children d71251d9fbbe 331b7a8bb830
files Doc/library/venv.rst Doc/using/venv-create.inc Lib/test/test_venv.py Lib/venv/__init__.py Misc/NEWS
diffstat 5 files changed, 105 insertions(+), 13 deletions(-)[+] [-] Doc/library/venv.rst 15 Doc/using/venv-create.inc 10 Lib/test/test_venv.py 54 Lib/venv/__init__.py 34 Misc/NEWS 5

line wrap: on

line diff

--- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -85,7 +85,8 @@ The high-level method described above ma mechanisms for third-party virtual environment creators to customize environment creation according to their needs, the :class:EnvBuilder class. -.. class:: EnvBuilder(system_site_packages=False, clear=False, symlinks=False, upgrade=False) +.. class:: EnvBuilder(system_site_packages=False, clear=False, [](#l1.8)

The :class:EnvBuilder class accepts the following keyword arguments on instantiation: @@ -105,6 +106,12 @@ creation according to their needs, the : environment with the running Python - for use when that Python has been upgraded in-place (defaults to False).

+

+ Creators of third-party virtual environment tools will be free to use the provided EnvBuilder class as a base class. @@ -201,11 +208,15 @@ creation according to their needs, the : There is also a module-level convenience function: -.. function:: create(env_dir, system_site_packages=False, clear=False, symlinks=False) +.. function:: create(env_dir, system_site_packages=False, clear=False, [](#l1.31)

Create an :class:EnvBuilder with the given keyword arguments, and call its :meth:~EnvBuilder.create method with the env_dir argument.

+ An example of extending EnvBuilder --------------------------------------

--- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -25,7 +25,7 @@ or equivalently:: The command, if run with -h, will show the available options:: usage: pyvenv [-h] [--system-site-packages] [--symlinks] [--clear]

Creates virtual Python environments in one or more target directories. @@ -43,6 +43,11 @@ The command, if run with -h, will sh raised. --upgrade Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place.

+ +.. versionchanged:: 3.4

If the target directory already exists an error will be raised, unless the --clear or --upgrade option was provided. @@ -51,6 +56,9 @@ The created pyvenv.cfg file also inc include-system-site-packages key, set to true if venv is run with the --system-site-packages option, false otherwise. +Unless the --without-pip option is given, :mod:ensurepip will be +invoked to bootstrap pip into the virtual environment. + Multiple paths can be given to pyvenv, in which case an identical virtualenv will be created, according to the given options, at each provided path.

--- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -16,6 +16,10 @@ from test.support import (captured_stdou import unittest import venv +skipInVenv = unittest.skipIf(sys.prefix != sys.base_prefix,

+ + class BaseTest(unittest.TestCase): """Base class for venv tests.""" @@ -83,8 +87,7 @@ class BasicTest(BaseTest): print(' %r' % os.listdir(bd)) self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn)

@@ -217,8 +220,7 @@ class BasicTest(BaseTest): # run the test, the pyvenv.cfg in the venv created in the test will # point to the venv being used to run the test, and we lose the link # to the source build - so Python can't initialise properly.

@@ -247,8 +249,50 @@ class BasicTest(BaseTest): out, err = p.communicate() self.assertEqual(out.strip(), envpy.encode()) + +@skipInVenv +class EnsurePipTest(BaseTest):

+

+

+

+ + def test_main():

if name == "main": test_main()

--- a/Lib/venv/init.py +++ b/Lib/venv/init.py @@ -24,10 +24,13 @@ optional arguments: raised. --upgrade Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place.

""" import logging import os import shutil +import subprocess import sys import sysconfig import types @@ -56,14 +59,17 @@ class EnvBuilder: :param symlinks: If True, attempt to symlink rather than copy files into virtual environment. :param upgrade: If True, upgrade an existing virtual environment.

def create(self, env_dir): """ @@ -76,6 +82,8 @@ class EnvBuilder: context = self.ensure_directories(env_dir) self.create_configuration(context) self.setup_python(context)

@@ -224,6 +232,12 @@ class EnvBuilder: shutil.copyfile(src, dst) break

+ def setup_scripts(self, context): """ Set up scripts into the created environment from a directory. @@ -317,7 +331,8 @@ class EnvBuilder: shutil.copymode(srcfile, dstfile) -def create(env_dir, system_site_packages=False, clear=False, symlinks=False): +def create(env_dir, system_site_packages=False, clear=False,

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -65,6 +65,8 @@ Core and Builtins Library ------- +- Issue #19552: venv now supports bootstrapping pip into virtual environments +