mirror of
https://github.com/python/cpython
synced 2026-09-29 07:25:29 +03:00
Added python3 symlink; removed Distribute-related code, docs and comments; changed Mac OS X computation to determine framework builds.
This commit is contained in:
parent
ab45e689be
commit
4469746878
1 changed files with 16 additions and 126 deletions
|
|
@ -3,8 +3,8 @@ Virtual environment (venv) package for Python. Based on PEP 405.
|
|||
|
||||
Copyright (C) 20011-2012 Vinay Sajip. All Rights Reserved.
|
||||
|
||||
usage: python -m venv [-h] [--no-distribute] [--system-site-packages]
|
||||
[--symlinks] [--clear] [--upgrade]
|
||||
usage: python -m venv [-h] [--system-site-packages] [--symlinks] [--clear]
|
||||
[--upgrade]
|
||||
ENV_DIR [ENV_DIR ...]
|
||||
|
||||
Creates virtual Python environments in one or more target directories.
|
||||
|
|
@ -14,7 +14,6 @@ positional arguments:
|
|||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--no-distribute Don't install Distribute in the virtual environment.*
|
||||
--system-site-packages
|
||||
Give the virtual environment access to the system
|
||||
site-packages dir.
|
||||
|
|
@ -24,10 +23,6 @@ optional arguments:
|
|||
raised.
|
||||
--upgrade Upgrade the environment directory to use this version
|
||||
of Python, assuming Python has been upgraded in-place.
|
||||
|
||||
*Note: Distribute support will be available during the alpha phase to
|
||||
facilitate testing third-party packages with venvs created using this package.
|
||||
This support will be removed after the alpha phase.
|
||||
"""
|
||||
import base64
|
||||
import io
|
||||
|
|
@ -36,6 +31,7 @@ import os
|
|||
import os.path
|
||||
import shutil
|
||||
import sys
|
||||
import sysconfig
|
||||
try:
|
||||
import threading
|
||||
except ImportError:
|
||||
|
|
@ -88,11 +84,11 @@ class EnvBuilder:
|
|||
"""
|
||||
if (self.symlinks and
|
||||
sys.platform == 'darwin' and
|
||||
'Library/Framework' in sys.base_prefix):
|
||||
sysconfig.get_config_var('PYTHONFRAMEWORK')):
|
||||
# Symlinking the stub executable in an OSX framework build will
|
||||
# result in a broken virtual environment.
|
||||
raise ValueError(
|
||||
"Symlinking is not supported on OSX framework Python.")
|
||||
'Symlinking is not supported on OSX framework Python.')
|
||||
env_dir = os.path.abspath(env_dir)
|
||||
context = self.ensure_directories(env_dir)
|
||||
self.create_configuration(context)
|
||||
|
|
@ -206,9 +202,10 @@ class EnvBuilder:
|
|||
if os.name != 'nt':
|
||||
if not os.path.islink(path):
|
||||
os.chmod(path, 0o755)
|
||||
path = os.path.join(binpath, 'python')
|
||||
if not os.path.exists(path):
|
||||
os.symlink(exename, path)
|
||||
for suffix in ('python', 'python3'):
|
||||
path = os.path.join(binpath, suffix)
|
||||
if not os.path.exists(path):
|
||||
os.symlink(exename, path)
|
||||
else:
|
||||
subdir = 'DLLs'
|
||||
include = self.include_binary
|
||||
|
|
@ -322,104 +319,6 @@ class EnvBuilder:
|
|||
os.chmod(dstfile, 0o755)
|
||||
|
||||
|
||||
# This class will not be included in Python core; it's here for now to
|
||||
# facilitate experimentation and testing, and as proof-of-concept of what could
|
||||
# be done by external extension tools.
|
||||
class DistributeEnvBuilder(EnvBuilder):
|
||||
"""
|
||||
By default, this builder installs Distribute so that you can pip or
|
||||
easy_install other packages into the created environment.
|
||||
|
||||
:param nodist: If True, Distribute is not installed into the created
|
||||
environment.
|
||||
:param progress: If Distribute is installed, the progress of the
|
||||
installation can be monitored by passing a progress
|
||||
callable. If specified, it is called with two
|
||||
arguments: a string indicating some progress, and a
|
||||
context indicating where the string is coming from.
|
||||
The context argument can have one of three values:
|
||||
'main', indicating that it is called from virtualize()
|
||||
itself, and 'stdout' and 'stderr', which are obtained
|
||||
by reading lines from the output streams of a subprocess
|
||||
which is used to install Distribute.
|
||||
|
||||
If a callable is not specified, default progress
|
||||
information is output to sys.stderr.
|
||||
"""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.nodist = kwargs.pop("nodist", False)
|
||||
self.progress = kwargs.pop("progress", None)
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def post_setup(self, context):
|
||||
"""
|
||||
Set up any packages which need to be pre-installed into the
|
||||
environment being created.
|
||||
|
||||
:param context: The information for the environment creation request
|
||||
being processed.
|
||||
"""
|
||||
if not self.nodist:
|
||||
if threading:
|
||||
self.install_distribute(context)
|
||||
|
||||
def reader(self, stream, context):
|
||||
"""
|
||||
Read lines from a subprocess' output stream and either pass to a progress
|
||||
callable (if specified) or write progress information to sys.stderr.
|
||||
"""
|
||||
progress = self.progress
|
||||
while True:
|
||||
s = stream.readline()
|
||||
if not s:
|
||||
break
|
||||
if progress is not None:
|
||||
progress(s, context)
|
||||
else:
|
||||
sys.stderr.write('.')
|
||||
#sys.stderr.write(s.decode('utf-8'))
|
||||
sys.stderr.flush()
|
||||
stream.close()
|
||||
|
||||
def install_distribute(self, context):
|
||||
"""
|
||||
Install Distribute in the environment.
|
||||
|
||||
:param context: The information for the environment creation request
|
||||
being processed.
|
||||
"""
|
||||
from subprocess import Popen, PIPE
|
||||
from urllib.request import urlretrieve
|
||||
|
||||
url = 'http://python-distribute.org/distribute_setup.py'
|
||||
binpath = context.bin_path
|
||||
distpath = os.path.join(binpath, 'distribute_setup.py')
|
||||
# Download Distribute in the env
|
||||
urlretrieve(url, distpath)
|
||||
progress = self.progress
|
||||
if progress is not None:
|
||||
progress('Installing distribute', 'main')
|
||||
else:
|
||||
sys.stderr.write('Installing distribute ')
|
||||
sys.stderr.flush()
|
||||
# Install Distribute in the env
|
||||
args = [context.env_exe, 'distribute_setup.py']
|
||||
p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)
|
||||
t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
|
||||
t1.start()
|
||||
t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr'))
|
||||
t2.start()
|
||||
p.wait()
|
||||
t1.join()
|
||||
t2.join()
|
||||
if progress is not None:
|
||||
progress('done.', 'main')
|
||||
else:
|
||||
sys.stderr.write('done.\n')
|
||||
# Clean up - no longer needed
|
||||
os.unlink(distpath)
|
||||
|
||||
def create(env_dir, system_site_packages=False, clear=False, symlinks=False):
|
||||
"""
|
||||
Create a virtual environment in a directory.
|
||||
|
|
@ -436,8 +335,7 @@ def create(env_dir, system_site_packages=False, clear=False, symlinks=False):
|
|||
:param symlinks: If True, attempt to symlink rather than copy files into
|
||||
virtual environment.
|
||||
"""
|
||||
# XXX This should be changed to EnvBuilder.
|
||||
builder = DistributeEnvBuilder(system_site_packages=system_site_packages,
|
||||
builder = EnvBuilder(system_site_packages=system_site_packages,
|
||||
clear=clear, symlinks=symlinks)
|
||||
builder.create(env_dir)
|
||||
|
||||
|
|
@ -460,17 +358,12 @@ def main(args=None):
|
|||
'directories.')
|
||||
parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
|
||||
help='A directory to create the environment in.')
|
||||
# XXX This option will be removed.
|
||||
parser.add_argument('--no-distribute', default=False,
|
||||
action='store_true', dest='nodist',
|
||||
help="Don't install Distribute in 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. ")
|
||||
help='Give the virtual environment access to the '
|
||||
'system site-packages dir.')
|
||||
if os.name == 'nt' or (sys.platform == 'darwin' and
|
||||
'Library/Framework' in sys.base_prefix):
|
||||
sysconfig.get_config_var('PYTHONFRAMEWORK')):
|
||||
use_symlinks = False
|
||||
else:
|
||||
use_symlinks = True
|
||||
|
|
@ -491,12 +384,9 @@ def main(args=None):
|
|||
options = parser.parse_args(args)
|
||||
if options.upgrade and options.clear:
|
||||
raise ValueError('you cannot supply --upgrade and --clear together.')
|
||||
# XXX This will be changed to EnvBuilder
|
||||
builder = DistributeEnvBuilder(system_site_packages=options.system_site,
|
||||
clear=options.clear,
|
||||
symlinks=options.symlinks,
|
||||
upgrade=options.upgrade,
|
||||
nodist=options.nodist)
|
||||
builder = EnvBuilder(system_site_packages=options.system_site,
|
||||
clear=options.clear, symlinks=options.symlinks,
|
||||
upgrade=options.upgrade)
|
||||
for d in options.dirs:
|
||||
builder.create(d)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue