Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions Lib/test/test_venv.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,12 @@
except ImportError:
ctypes = None

skipInVenv = unittest.skipIf(sys.prefix != sys.base_prefix,
'Test not appropriate in a venv')
# Platforms that set sys._base_executable can create venvs from within
# another venv, so no need to skip tests that require venv.create().
requireVenvCreate = unittest.skipUnless(
hasattr(sys, '_base_executable')
or sys.prefix == sys.base_prefix,
'cannot run venv.create from within a venv on this platform')

def check_output(cmd, encoding=None):
p = subprocess.Popen(cmd,
Expand Down Expand Up @@ -118,7 +122,7 @@ def test_prompt(self):
context = builder.ensure_directories(self.env_dir)
self.assertEqual(context.prompt, '(My prompt) ')

@skipInVenv
@requireVenvCreate
def test_prefixes(self):
"""
Test that the prefix values are as expected.
Expand Down Expand Up @@ -254,7 +258,7 @@ def test_symlinking(self):
# 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.
@skipInVenv
@requireVenvCreate
def test_executable(self):
"""
Test that the sys.executable value is as expected.
Expand Down Expand Up @@ -298,6 +302,7 @@ def test_unicode_in_batch_file(self):
)
self.assertEqual(out.strip(), '0')

@requireVenvCreate
def test_multiprocessing(self):
"""
Test that the multiprocessing is able to spawn.
Expand All @@ -311,7 +316,7 @@ def test_multiprocessing(self):
'print(Pool(1).apply_async("Python".lower).get(3))'])
self.assertEqual(out.strip(), "python".encode())

@skipInVenv
@requireVenvCreate
class EnsurePipTest(BaseTest):
"""Test venv module installation of pip."""
def assert_pip_not_installed(self):
Expand Down
19 changes: 12 additions & 7 deletions Lib/venv/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,18 +176,23 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False):
# On Windows, we rewrite symlinks to our base python.exe into
# copies of venvlauncher.exe
basename, ext = os.path.splitext(os.path.basename(src))
if basename.endswith('_d'):
ext = '_d' + ext
basename = basename[:-2]
if sysconfig.is_python_build(True):
srcfn = os.path.join(os.path.dirname(__file__),
"scripts",
"nt",
basename + ext)
# Builds or venv's from builds need to remap source file
# locations, as we do not put them into Lib/venv/scripts
if sysconfig.is_python_build(True) or not os.path.isfile(srcfn):
if basename.endswith('_d'):
ext = '_d' + ext
basename = basename[:-2]
if basename == 'python':
basename = 'venvlauncher'
elif basename == 'pythonw':
basename = 'venvwlauncher'
scripts = os.path.dirname(src)
src = os.path.join(os.path.dirname(src), basename + ext)
else:
scripts = os.path.join(os.path.dirname(__file__), "scripts", "nt")
src = os.path.join(scripts, basename + ext)
src = srcfn

shutil.copyfile(src, dst)

Expand Down