summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_pathlib.py2
-rw-r--r--Lib/test/test_venv.py1
-rw-r--r--Lib/venv/__init__.py49
3 files changed, 31 insertions, 21 deletions
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index d3fd4bd..876eecc 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -1521,7 +1521,7 @@ class _BasePathTest(object):
# resolves to 'dirB/..' first before resolving to parent of dirB.
self._check_resolve_relative(p, P(BASE, 'foo', 'in', 'spam'), False)
# Now create absolute symlinks
- d = support._longpath(tempfile.mkdtemp(suffix='-dirD', dir=os.getcwd()))
+ d = support._longpath(tempfile.mkdtemp(suffix='-dirD'))
self.addCleanup(support.rmtree, d)
os.symlink(os.path.join(d), join('dirA', 'linkX'))
os.symlink(join('dirB'), os.path.join(d, 'linkY'))
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 22a3b78..461fe7af 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -243,7 +243,6 @@ class BasicTest(BaseTest):
self.assertIn('include-system-site-packages = %s\n' % s, data)
@unittest.skipUnless(can_symlink(), 'Needs symlinks')
- @unittest.skipIf(os.name == 'nt', 'Symlinks are never used on Windows')
def test_symlinking(self):
"""
Test symlinking works as expected
diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
index 5438b0d..0434208 100644
--- a/Lib/venv/__init__.py
+++ b/Lib/venv/__init__.py
@@ -64,11 +64,10 @@ class EnvBuilder:
self.system_site_packages = False
self.create_configuration(context)
self.setup_python(context)
- if not self.upgrade:
- self.setup_scripts(context)
if self.with_pip:
self._setup_pip(context)
if not self.upgrade:
+ self.setup_scripts(context)
self.post_setup(context)
if true_system_site_packages:
# We had set it to False before, now
@@ -159,6 +158,14 @@ class EnvBuilder:
f.write('include-system-site-packages = %s\n' % incl)
f.write('version = %d.%d.%d\n' % sys.version_info[:3])
+ if os.name == 'nt':
+ def include_binary(self, f):
+ if f.endswith(('.pyd', '.dll')):
+ result = True
+ else:
+ result = f.startswith('python') and f.endswith('.exe')
+ return result
+
def symlink_or_copy(self, src, dst, relative_symlinks_ok=False):
"""
Try symlinking a file, and if that fails, fall back to copying.
@@ -188,9 +195,9 @@ class EnvBuilder:
binpath = context.bin_path
path = context.env_exe
copier = self.symlink_or_copy
+ copier(context.executable, path)
dirname = context.python_dir
if os.name != 'nt':
- copier(context.executable, path)
if not os.path.islink(path):
os.chmod(path, 0o755)
for suffix in ('python', 'python3'):
@@ -202,22 +209,26 @@ class EnvBuilder:
if not os.path.islink(path):
os.chmod(path, 0o755)
else:
- # For normal cases, the venvlauncher will be copied from
- # our scripts folder. For builds, we need to copy it
- # manually.
- if sysconfig.is_python_build(True):
- suffix = '.exe'
- if context.python_exe.lower().endswith('_d.exe'):
- suffix = '_d.exe'
-
- src = os.path.join(dirname, "venvlauncher" + suffix)
- dst = os.path.join(binpath, context.python_exe)
- copier(src, dst)
-
- src = os.path.join(dirname, "venvwlauncher" + suffix)
- dst = os.path.join(binpath, "pythonw" + suffix)
- copier(src, dst)
+ # See bpo-34011. When using a proper install, we should only need to
+ # copy the top-level of DLLs.
+ include = self.include_binary
+ files = [f for f in os.listdir(dirname) if include(f)]
+ for f in files:
+ src = os.path.join(dirname, f)
+ dst = os.path.join(binpath, f)
+ if dst != context.env_exe: # already done, above
+ copier(src, dst)
+ # When creating from a build directory, we continue to copy all files.
+ if sysconfig.is_python_build(True):
+ subdir = 'DLLs'
+ dirname = os.path.join(dirname, subdir)
+ if os.path.isdir(dirname):
+ files = [f for f in os.listdir(dirname) if include(f)]
+ for f in files:
+ src = os.path.join(dirname, f)
+ dst = os.path.join(binpath, f)
+ copier(src, dst)
# copy init.tcl over
for root, dirs, files in os.walk(context.python_dir):
if 'init.tcl' in files:
@@ -315,7 +326,7 @@ class EnvBuilder:
dstfile = os.path.join(dstdir, f)
with open(srcfile, 'rb') as f:
data = f.read()
- if not srcfile.endswith(('.exe', '.pdb')):
+ if not srcfile.endswith('.exe'):
try:
data = data.decode('utf-8')
data = self.replace_variables(data, context)